log4j2配置日志

概述

Apache Log4j 2是日志框架Log4j的升级,
它比其前身Log4j 1.x提供了重要的改进,
并且参考了Logback中许多有用的改进,
同时修复了Logback的一些固有问题。
详细请参考官网:Apache Log4j 2

自动配置

Log4j2能够在初始化期间自动配置,
它支持4种格式的配置文件:
Properties, YAML, JSON, XML
并且按从高到低的加权顺序查找配置文件。

Log4j2共有8种日志级别,
按照优先级从小到大排序:

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

当日志级别设置为某一级别时,
则会打印大于等于该级别的日志,
比如日志级别设置为ERROR,
则会打印ERROR,FATAL级别的日志。
ALL会把所有级别的日志打印出来,
OFF不会打印任何级别的日志,
所以严格来讲只有6种日志级别。

xml配置总结

配置结构

本文事例中configuration下有三个节点

properties:配置文件中用到的参数设定、被下面的appenders、loggers配置项引用
appenders:日志的输出源:设置日志输出目的地,内容和格式等。
loggers:日志的输入源:设置日志级别和使用的Appenders。

几个重要的配置项

1、fileName是日志生成后所在的文件名,filePattern是滚动机制发动后fileName归档后的文件名。如果fileName为空,fileName会被设置成filePattern。
2、filePattern:filePattern=“logs/%d{yyyy-MM-dd}/game.%d{yyyy-MM-dd-HH}.%i.log”,其中红色部分%d{yyyy-MM-dd},实现的效果是每天的日志会归档到同一天
3、filePattern:filePattern=“logs/%d{yyyy-MM-dd}/game.%d{yyyy-MM-dd-HH}.%i.log”,其中红色部分%i实现的效果是当程序在归档时,文件名序号会自动递增,最大值后面介绍。
4、ThresholdFilter:日志级别过滤器,过滤的结果值是个枚举类型。

enum Result {
    /**
     * 当前的日志会被输出,不需要再经过其他过滤器筛选
     */
    ACCEPT,
    /**
     * 当前过滤器不做判定,需要其他过滤器筛选,没有后续过滤器的话该日志被过滤掉
     */
    NEUTRAL,
    /**
     * 当前的日志会被过滤掉
     */
    DENY;
}

5、TimeBasedTriggeringPolicy中设定的interval的单位是filePattern进行处理后获取的,具体来说就是filePattern="${LOG_REPO}/game.%d{yyyy-MM-dd-HH}.%i.log"中包含了"H",会被转化成{RolloverFrequency.HOURLY}
6、DefaultRolloverStrategy中max参数的设定:max参数是配合filePattern="${LOG_REPO}/game.%d{yyyy-MM-dd-HH}.%i.log"中的%i进行使用的。这里的max设定了除%i外相同的文件数,默认为7
7、Delete表示的是在{basePath}文件夹中递归深度{maxDepth}下删除指定条件的归档日志。Delete支持的策略包括一下几种。
IfAccumulatedFileCount:所有文件数超过{threshold}会被删除
IfAccumulatedFileSize:所有文件大小超过{threshold}会被删除
IfFileName:文件名符合正则表达式的删除
IfLastModified:上次更新时间超过一定时限时删除
IfAll、IfAny、IfNot来表示以上几种条件的组合策略
查看代码发现以上策略在log4j-core的Log4j2Plugins.dat已经注册过,所以能直接使用。

<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>

pattern定义日志输出格式:

配置 说明

%d{HH:mm:ss.SSS} 输出日志打印的时间,精确到毫秒
[%t] 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,不足在右边补空格
%logger{36} 输出logger名称,一般是类的全限定路径名
%msg 输出要打印的业务日志信息
%n 日志换行
实际会输出如下日志:

11:33:08.438 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log

更多的PatternLayout设置请参考官网:
Log4j2 PatternLayout

添加自定义Appender

<Appenders>
    <File name="File" fileName="test.log">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    </File>
</Appenders>

这里增加了一个类型为File的Appender,
name为File,
FileName为test.log,
表示日志会打印到test.log文件。

添加自定义Logger

<Loggers>
    <Logger name="org.apache.logging.log4j" level="ERROR" additivity="true">
        <AppenderRef ref="File" />
    </Logger>
</Loggers>

这里增加了一个Logger,需要配合上面的Appender使用,
name为Log4j2Test的包路径org.apache.logging.log4j,
level日志级别为EEROR,
AppenderRef指向了上面新增的名称为File的Appender,
表示Log4j2Test的ERROR和FATAL级别的日志会打印到test.log,

test.log文件内容:

16:55:31.343 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log
16:55:31.345 [main] FATAL org.apache.logging.log4j.Log4j2Test - fatal level log

同时additivity设置为true,
会将当前的Logger特性会传递给Root,
即上述的日志不仅会输出到test.log文件,
也会输出到Root指向的控制台,

Console控制台内容:

16:55:31.343 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log
16:55:31.345 [main] FATAL org.apache.logging.log4j.Log4j2Test - fatal level log
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
    <!--properties-->
    <properties>
        <!-- 运行日志位置-->
        <property name="LOG_HOME">logs</property>
        <!-- info日志滚动仓库-->
        <property name="LOG_REPO">logs/%d{yyyy-MM-dd}</property>
        <!-- 错误日志滚动仓库-->
        <property name="WARN_REPO">logs/error</property>
        <!--日志格式-->
        <property name="LOG_PATTERN">%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n</property>
        <!--文件过期时间-->
        <property name="LOG_EXPIRE">15d</property>
        <!--单文件大小-->
        <property name="LOG_SIZE">100MB</property>
    </properties>
    <!--appenders -->
    <appenders>
        <!--控制台输出配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式 -->
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
 
        <!--打印出所有的info信息,每小时滚动一次,单文件最大100M,文件最多保留15天 -->
        <RollingFile name="InfoFile" fileName="${LOG_HOME}/game.log"
                     filePattern="${LOG_REPO}/game.%d{yyyy-MM-dd-HH}.%i.log">
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--每小时滚动一次,单文件最大100M-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="${LOG_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="10">
                <!-- 每个文件最长保留时长=>15天-->
                <Delete basePath="logs/" maxDepth="2">
                    <IfFileName regex=".*log" />
                    <IfLastModified age="${LOG_EXPIRE}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
        <!--打印出所有的warn/error信息,单文件最大100M后滚动,文件最多保留15天 -->
        <RollingFile name="WarnFile" fileName="${LOG_HOME}/game.warn.log"
                     filePattern="${WARN_REPO}/game.%d{yyyy-MM-dd}.%i.log">
            <Filters>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--单文件最大100M-->
                <SizeBasedTriggeringPolicy size="${LOG_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy>
                <!-- 每个文件最长保留时长=>15天-->
                <Delete basePath="logs/" maxDepth="2">
                    <IfFileName regex=".*log" />
                    <IfLastModified age="${LOG_EXPIRE}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
    </appenders>
 
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>
        <!--运行日志-->
        <logger name="com.msgame" additivity="false">
            <level value="INFO"/>
            <appenderRef ref="InfoFile"/>
            <appenderRef ref="WarnFile"/>
            <appenderRef ref="Console"/>
        </logger>
        <!--默认日志 -->
        <root level="info">
            <appender-ref ref="InfoFile"/>
        </root>
    </loggers>
</configuration>

测试代码

package org.apache.logging.log4j;

public class Log4j2Test {
    private static Logger LOG = LogManager.getLogger(Log4j2Test.class);

    public static void main(String[] args) throws Exception {
        // 一直打印日志,用于测试Log4j2功能
        while (true) {
            logAll();
        }
    }

    // 打印各种级别的日志用于测试
    public static void logAll() throws Exception {
        LOG.trace("trace level log");
        LOG.debug("debug level log");
        LOG.info("info level log");
        LOG.error("error level log");
        LOG.fatal("fatal level log");
        // 设置休眠时间(单位ms),控制日志打印速度
        Thread.sleep(3);
    }
}

运行上面的测试程序,
在控制台打印出如下日志:

ERROR StatusLogger No Log4j 2 configuration file found. 
Using default configuration (logging only errors to the console), or user programmatically provided configurations. 
Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging.
See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
11:33:08.438 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log
11:33:08.440 [main] FATAL org.apache.logging.log4j.Log4j2Test - fatal level log

可以看到ERROR报错了,没有找到Log4j2的配置文件,
使用了默认配置,只打印error级别日志到console控制台,
然后控制台输出了error和fatal两个级别的日志信息。

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于PyTorch的Embedding和LSTM的自动写诗实验LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值