前言:
Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI 组件、甚至是套接口服务 器、NT 的事件记录器、UNIX Syslog 守护进程等;
我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
1 主要的组件
Log4j有三个主要的组件:
loggers: 负责捕获日志信息 ,即日志纪录器,控制日志的输出以及输出级别(JUL做日志级别用Level类)
appenders: 负责输出信息到不同的目的地 ,即输出日志到指定的地方
layouts: 负责使用不同的样式输出日志,即格式化日志
1.1 日志级别
例如DEBUG、INFO、WARN、ERROR…级别是分大小的,
DEBUG < INFO < WARN < ERROR
,可以用来代指该日志的重要程度,可以由这个来设置对应的。
1.2 日志输出位置
日志输出的位置是由参数appender决定的,根据不同的参数设定,可以将日志文件自定义输出到控制台、文件中等
- 常用Appenders:
- ConsoleAppender
将日志输出到控制台
- FileAppender
将日志输出到文件中
- DailyRollingFileAppender (根据天数来对新日志文件的创建)
将日志输出到一个日志文件,并且每天输出到一个新的文件
- RollingFileAppender (根据大小来对新日志文件的创建)
将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
- JDBCAppender
把日志信息保存到数据库中
1.3 日志格式化
在日志输出中,用户可以根据自己的实际需求,把对应的日志按照自己的想法和格式进行输出,在Layouts给用户提供四种日志输出样式。
-
根据HTML样式
-
自由指定样式
-
包含日志级别与信息的样式
-
包含日志时间、线程、类别等信息的样式
-
常用Layouts:
- HTMLLayout
格式化日志输出为HTML表格形式 - SimpleLayout
简单的日志输出格式化,打印的日志格式如默认INFO级别的消息 PatternLayout
最强大的格式化组件,可以根据自定义格式输出日志,如果没有指定转换格式, 就是用默认的转换格式
- HTMLLayout
案例使用:
- %m 输出代码中指定的日志信息
- %p 输出优先级,及 DEBUG、INFO 等
- %n 换行符(Windows平台的换行符为 “\n”,Unix 平台为 “\n”)
- %r 输出自应用启动到输出该 log 信息耗费的毫秒数
- %c 输出打印语句所属的类的全名
- %t 输出产生该日志的线程全名
- %d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
- %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
- %F 输出日志消息产生时所在的文件名称
- %L 输出代码中的行号
- %% 输出一个 “%” 字符
可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式。
如:
%5c 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
%-5c 输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
%.5c 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不
会有空格
%20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉
1.4 项目使用情况说明:
输出日志使用是DailyRollingFileAppender,会每天生成日志。
==优化点:== 目前项目中有实时库的存在,写日志会很多,导致当日日志文件也会很大,查看日志的时候会存在打开困难的情况,可以考虑使用按大小创建日志比如300MB创建一个新的,给一个新的命名。
输出级别:
目前的级别是在debug info warn error 这几个级别中
分为两个目录写日志 debug_log 、 error_log 这两个,error中写的是info最小的,debug中写的是debug最小的。
==优化点:== 两个日志写入内容有重复,
1、可以在控制层对日志进行整理处理,分别在不同的地方写入不同的日志。
2、规划重要耗时做debug处理,其他警告、报错信息放到error中去。
<?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="A_ERROR" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Append" value="true"/>
<param name="Encoding" value="UTF-8" />
<param name="File" value="/var/opt/meta/webapp/logs/meta_error.log"/>
<param name="DatePattern" value="'.'yyyyMMdd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss} [%-5p] - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="info"/>
<param name="LevelMax" value="error"/>
<param name="AcceptOnMatch" value="true"/>
</filter>
</appender>
<appender name="A_DEBUG" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Append" value="true"/>
<param name="Encoding" value="UTF-8" />
<param name="File" value="/var/opt/meta/webapp/logs/meta_debug.log"/>
<param name="DatePattern" value="'.'yyyyMMdd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss} [%-5p] - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="debug"/>
<param name="LevelMax" value="error"/>
<param name="AcceptOnMatch" value="true"/>
</filter>
</appender>
<!-- framework logger -->
<logger name="java.sql">
<level value="warn" />
</logger>
<logger name="org.mybatis">
<level value="warn" />
<!-- <appender-ref ref="STDOUT" />-->
</logger>
<logger name="org.apache">
<level value="warn" />
</logger>
<logger name="org.springframework">
<level value="warn" />
</logger>
<!-- the root logger -->
<root>
<level value="all" />
<appender-ref ref="A_ERROR" />
<appender-ref ref="A_DEBUG" />
</root>
</log4j:configuration>
参考链接 :
【精选】日志框架(2) : Log4j介绍及使用_log4j日志的使用-CSDN博客
log4j配置详解 log4j中文文档_log4j官方文档-CSDN博客
本文作者:redtea 红茶的博客
本文链接:https://redtea.top版权声明:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可,非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。