Log4j 配置

Posted 小茗同学的学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log4j 配置相关的知识,希望对你有一定的参考价值。

1. Log4j 1.2.17 properties配置

1.1 准备工作

  • 创建maven工程
  • 引入log4j的jar包
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

1.2 配置文件(properties和xml二选一)

log4j.properties
# log4j 配置
## 输出log到控制台
log4j.rootLogger=fatal,console
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern = %dyyyy-MM-dd HH:mm:ss:SSS %l [%-5p] %m%n

## 输出日志到文件1
log4j.logger.demo1=warn,demo1
log4j.appender.demo1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.demo1.Append = true
log4j.appender.demo1.file = ./logs/demo1.log
log4j.appender.demo1.DatePattern = .yyyyMMdd
log4j.appender.demo1.Threshold = trace
log4j.appender.demo1.layout = org.apache.log4j.PatternLayout
log4j.appender.demo1.layout.conversionPattern = %dyyyy-MM-dd HH:mm:ss:SSS %l [%-5p] %m%n

## 输出日志到文件2
log4j.logger.demo2=fatal,demo2
log4j.appender.demo2 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.demo2.Append = true
log4j.appender.demo2.file = ./logs/demo2.log
log4j.appender.demo2.DatePattern = .yyyyMMdd
log4j.appender.demo2.Threshold = trace
log4j.appender.demo2.layout = org.apache.log4j.PatternLayout
log4j.appender.demo2.layout.conversionPattern = %dyyyy-MM-dd HH:mm:ss:SSS %l [%-5p] %m%n
log4j.xml
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN"
"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration
    xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- 将日志信息输出到控制台 -->
    <appender name="console_appender" class="org.apache.log4j.ConsoleAppender" >
        <param name="Target" value="System.out" />
        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="%dyyyy-MM-dd HH:mm:ss:SSS %l [%-5p] %m%n" />
        </layout>
        <!--过滤器设置输出的级别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <!-- 设置日志输出的最小级别 -->
            <param name="levelMin" value="WARN" />
            <!-- 设置日志输出的最大级别 -->
            <param name="levelMax" value="ERROR" />
            <!-- 设置日志输出的xxx,默认是false -->
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>
    <!--输出方式:每天一个日志文件 -->
    <appender name="demo3_file" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="./logs/demo3.log" />
        <param name="Append" value="true" />
        <param name="DatePattern" value=".yyyyMMdd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%dyyyy-MM-dd HH:mm:ss:SSS %l [%-5p] %m%n" />
        </layout>
    </appender>

    <logger name="demo3" additivity="false">
        <level class="org.apache.log4j.Level" value="fatal" />
        <appender-ref ref="demo3_file" />
    </logger>
    <!-- 没有配置logger时,root配置生效 -->
    <root>
        <appender-ref ref="console_appender" />
    </root>
</log4j:configuration>

1.3 测试

    public static void main(String[] args) 
        Logger log = Logger.getLogger("demo3");
        log.fatal(" 严重错误,一般造成系统崩溃并终止运行");
        log.error(" 错误信息,不会影响系统运行");
        log.warn(" 警告信息,可能会发生问题");
        log.info(" 运行信息,数据连接,网络连接,IO操作等");
        log.debug(" 调试信息,一般在开发中使用,记录程序变量传递信息等等");
        log.trace(" 追踪信息,记录程序所有的流程信息");
    

1.4 关于日志输出格式

%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为IS08601,也可以在其后指定格式,
比如: %dyyy MMM dd HH:mm:ss,SSS,输出类似2002年10月18日 22: 10: 28,921
%r: 输出自应用启动到输出该1og信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C,%M(%;%)的组合,包括类目名、发生的线程,以及在代码中的行数。
举例:Test1og4.main(TestLog4.Java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像Java servlets这样的多客户多线程的应用中,
输出一个”%”字符%%:
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,windows平台为”r n”,unix平台为”n”输出日志信息换行

2. log4j2 配置

2.1 准备工作

  • 创建maven工程
  • 引入依赖
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.20.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.20.0</version>
        </dependency>

2.2 配置文件

log4j2的配置文件不再支持properties,但同时支持log4j2.xml,log4j.json,log4j.jsn等名称的配置文件.这里只展示xml配置方法

log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info" >
    <Properties>
        <Property name="logDir">./logs</Property>
    </Properties>
    <!-- 定义appenders -->
    <appenders>
        <!-- 控制台日志输出 -->
        <Console name="console" target="SYSTEM_OUT" >
            <!-- 定义控制台输出级别 默认输出info以上的信息 -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="%dHH:mm:ss:SSS %l %-5level %m%n" />
        </Console>
        <!-- 日志文件输出 -->
        <File name="demo4_filePattern" fileName="$logDir/demo4.log" append="true">
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="%dyyyy-MM-dd HH:mm:ss:SSS %l %-5level %m%n" />
        </File>
        <File name="demo5_filePattern" fileName="$logDir/demo5.log" append="true">
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="%dyyyy-MM-dd HH:mm:ss:SSS %l %-5level %m%n" />
        </File>
        <rollingFile name="demo4_rollingFile" filePattern="$logDir/demo4-$$date:yyyy-MM-dd-%i.log" >
            <PatternLayout pattern="%dyyyy-MM-dd HH:mm:ss:SSS %l %-5level %m%n" />
            <policies>
                <CronTriggeringPolicy schedule="0 40 23 * * ?" />
                <SizeBasedTriggeringPolicy size="200MB" />
            </policies>
            <!-- 每天日志最多切分成10个 -->
            <DirectWriteRolloverStrategy maxFiles="10">
                <Delete basePath="$logDir" maxDepth="2">
                    <!-- 此处注意,如果没有*/不会生效 -->
                    <IfFileName glob="*/.*.log" />
                    <!-- 超过30天的日志自动删除,滚动的时候触发 -->
                    <IfLastModified age="P365D" />
                </Delete>
            </DirectWriteRolloverStrategy>
        </rollingFile>
        <rollingFile name="demo5_rollingFile" filePattern="$logDir/demo5-$$date:yyyy-MM-dd-%i.log" >
            <PatternLayout pattern="%dyyyy-MM-dd HH:mm:ss:SSS %l %-5level %m%n" />
                        <policies>
                <CronTriggeringPolicy schedule="0 40 23 * * ?" />
                <SizeBasedTriggeringPolicy size="200MB" />
            </policies>
            <!-- 每天日志最多切分成10个 -->
            <DirectWriteRolloverStrategy maxFiles="10">
                <Delete basePath="$logDir" maxDepth="2">
                    <!-- 此处注意,如果没有*/不会生效 -->
                    <IfFileName glob="*/.*.log" />
                    <!-- 超过30天的日志自动删除,滚动的时候触发 -->
                    <IfLastModified age="P365D" />
                </Delete>
            </DirectWriteRolloverStrategy>
        </rollingFile>
    </appenders>
    <loggers>
        <root level = "trace" >
            <appender-ref ref="console" />
            <appender-ref ref="rollingFile" />
        </root>
        <logger name="demo4">
            <appender-ref ref="demo4_filePattern" />
            <appender-ref ref="demo4_rollingFile" />
        </logger>
        <logger name="demo5">
            <appender-ref ref="demo5_filePattern" />
            <appender-ref ref="demo5_rollingFile" />
        </logger>
    </loggers>
</configuration>

1.3 关于日志输出格式

%c 输出logger名称
%C 输出类名
%dHH:mm:ss.sss 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符.如果不足在右边补0
%logger 输出logger名称因为Root Logger没有名称,所以没有输出%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M或%method 输出所在方法名
%l 输出完整的错误位置,包括类名、方法名、文件名、行数
%p 该条日志的优先级
%replacepatternHregexHsubstitution 将pattern的输出结果pattern按照正则表达式regex替换成substitution

以上是关于Log4j 配置的主要内容,如果未能解决你的问题,请参考以下文章

在linux下配置log4j

log4j怎么配置每五分钟生成一个日志

log4j配置之后报错如何解决?

log4j配置之后出现错误

log4j2 配置文件 log4j2.xml 详解(转载)

springboot 关于log4j日志配置