Log4j
( Logger For Java ) , Java 日志的记录包。 官方网站 。Log4j 是 Apache
的一个开源项目, 为Java提供了日志记录功能。能够让程序员非常方便的记录日志, 并且提供了多种适配方式,能满足各种需求。
使用Log4j 只需要导入一个jar包, jar 下载地址 。 Maven 坐标为:
<dependency> <groupId>org.log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.9</version> </dependency> 复制代码
Log4j 核心主要包括三部分:
下面是 Log4j 中Level 源码。
通过源码我们可以看到, Log4j 日志等级有:
off fatal error warn info debug trace all
在 Logger 核心类中, 除了 off/all
以外, 其他每个日志等级都对应一组重载的方法, 用于记录不同等级的日志 。
Appender 用于定义日志的输出位置, Log4j 提供了多种可供选择的追加器。常用追加器有
Appender | 作用 |
---|---|
ConsoleAppender | 将日志记录在控制台 |
FileAppender | 将日志记录在文件中 |
RollingFileAppender | 将日志记录在文件中, 当文件达到一定大小之后,会创建新文件 |
DailyRollingFileAppender | 将日志记录在文件中, 每天一个备份文件 |
JDBCAppender | 将日志记录在数据库表中 |
以上五个为常用Appender,完整列表为
当然, 如果觉得这些也不能满足你的需求, 你可以:
Appender
接口 implements Appender
AppenderSkeleton
类 重写核心方法 Layout 用于定义输出日志的格式, 常用Layout 有
Layout | 格式 |
---|---|
SimpleLayout | 简单格式, 格式为 日志等级 - 日志内容 |
TTCCLayout | Time,Thread,Category,Context [线程] 日志等级 记录日志的类的包名.类名 - 日志内容 |
XMLLayout | 以XML格式输出日志 |
HTMLLayout | 以HTML文件格式输出日志 |
PatternLayout | 灵活格式输出日志, 使用通配符自定义格式 |
以上五个为常用Layout ,完整列表为
public class Test { public static void main(String[] args) { // 获取日志对象, 参数为当前类class对象 Logger logger = Logger.getLogger(Test.class); // 设置日志等级为TRACE等级 logger.setLevel(Level.DEBUG); // 创建Appender对象 ConsoleAppender conAppender = new ConsoleAppender(); // 设置Appender conAppender.setTarget(ConsoleAppender.SYSTEM_OUT); conAppender.activateOptions(); // 设置Layout SimpleLayout simpleLayout = new SimpleLayout(); // 将 simpleLayout 设置到Appender中 conAppender.setLayout(simpleLayout); // 将Appender 添加到 rootLogger 中 logger.addAppender(conAppender); // 记录日志 logger.error("这是日志信息"); } } 复制代码
ERROR - 这是日志信息 Process finished with exit code 0 复制代码
这种方式是最直观的方式, 代码非常直观的定义了Log4j 的三大组成要素,缺点是 代码太过于冗余, 如果只是为了记录个日志, 而要去写这么长的代码, 真的是 本末倒置了, 也不能体现出Log4j 灵活的特性。所以, 实际开发中不会使用这种模式( 其实真是原因就是根本没人这样用, 小C就是非要找些冠冕堂皇的理由以显示其专业性!! )
我们可以在 Resources Root
目录下(如果是Eclipse , 可以是 src
或者 任何 source folder
), 说白了就是项目编译后的根目录(对于Java萌新而言, 就暂且认为是 src 目录吧), 创建一个 log4j.xml
配置文件, 一定要注意:文件的位置 和 文件名 一个都不能错 , 然后在 XML 文件中添加配置信息
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "log4j" "log4j.dtd" > <log4j:configuration> <appender name="cons" class="org.apache.log4j.ConsoleAppender"> <param name="target" value="System.out"/> <layout class="org.apache.log4j.SimpleLayout"></layout> </appender> <root> <level value="INFO"></level> <appender-ref ref="cons"/> </root> </log4j:configuration> 复制代码
简单看看吧, 这种配置方式实际开发过程中也没人使用。
我们可以在 Resources Root
目录下(如果是Eclipse , 可以是 src
或者 任何 source folder
), 说白了就是项目编译后的根目录(对于Java萌新而言, 就暂且认为是 src 目录吧), 创建一个 log4j.properties
配置文件, 一定要注意:文件的位置 和 文件名 一个都不能错 , 然后在 properties 文件中添加配置信息
log4j.rootLogger=debug,cons log4j.appender.cons=org.apache.log4j.ConsoleAppender log4j.appender.cons.target=System.out log4j.appender.cons.layout=org.apache.log4j.PatternLayout log4j.appender.cons.layout.ConversionPattern=%m%n 复制代码
import org.apache.log4j.*; public class Test { public static void main(String[] args) { // 获取日志对象, 参数为当前类class对象 Logger logger = Logger.getLogger(Test.class); // 记录日志 logger.error("这是日志信息"); } } 复制代码
propertis 文件是最常用的配置方式。实际开发过程中, 基本都是使用properties文件。后面的章节会给出一个比较完整的配置手册
pripertis配置文件的配置方式为
# 配置日志等级, 指定生效的Appender名字, AppenderA是定义的Appender的名字 log4j.rootLogger=日志等级,AppenderA,AppenderB,... # ---------------- 定义一个appender------------------------ # 定义一个appender, appender名字可以是任意的, # 如果要使该appender生效, 须加入到上一行rootLogger中, 后面为对应的Appender类 log4j.appender.appender名字=org.apache.log4j.ConsoleAppender log4j.appender.appender名字.target=System.out # 定义Appender的布局方式 log4j.appender.appender名字.layout=org.apache.log4j.SimpleLayout 复制代码
有的童鞋会觉得说Java代码的写法更加的直观, 每一行在做什么更清晰, 其实, 对比一下Java代码和Properties文件就会发现, 两者是一样的, Properties文件配置也不需要记特别多的东西。比如说
其实, properties 文件 就是 对java代码的简化, 使用Java代码解读下properites, 你会发现结果是基本一致的
总结来说, log4j 的配置文件主要架构是
log4j.rootLogger=日志等级, AppenderNameA,,,, log4j.appender.AppenderNameA=要使用的Appender log4j.appender.AppenderNameA.PropertyA=PropertyA的值 log4j.appender.AppenderNameA.PropertyB=PropertyB的值 log4j.appender.AppenderNameA.PropertyC=PropertyC的值 log4j.appender.AppenderNameA.layout=要使用的Layout log4j.appender.AppenderNameA.layout.PropertyA=PropertyA的值 log4j.appender.AppenderNameA.layout.PropertyB=PropertyB的值 log4j.appender.AppenderNameA.layout.PropertyC=PropertyC的值 复制代码
PropertyA 其实就是 前面的类中的 setXxxx 方法对应的属性 , 例如:
log4j.appender.cons=org.apache.log4j.ConsoleAppender log4j.appender.cons.target=System.out 复制代码
也就意味着
ConsoleAppender cons = new ConsoleAppender(); cons.setTarget("System.out"); 复制代码
如果set方法参数是对象类型, 那么则写对应类型的包名.类名, 例如
log4j.appender.cons=org.apache.log4j.ConsoleAppender log4j.appender.cons.layout=org.apache.log4j.SimpleLayout 复制代码
也就意味着
ConsoleAppender cons = new ConsoleAppender(); SimpleLayout simpleLayout = new SimpleLayout(); cons.setLayout(simpleLayout); 复制代码
如此, 就算你忘记了要配置哪些东西, 翻一翻源代码也就OK了
# 设置 全局日志等级 # 可以使用log4j.appender.xxx.threshold=LEVEL 为某个特定appender设置日志等级 # 设置 所有生效的appender, 没有出现在此处的appender, 即使定义了也无效 log4j.rootLogger = debug,cons,myFile,myrFile,mydFile,jdbc # ================================= 控制台 日志记录 ================================ log4j.appender.cons=org.apache.log4j.ConsoleAppender # 设置当前appender的日志等级为info,当方法的优先级大于info时, 控制台才会有输出 log4j.appender.cons.threshold=info # 设置日志输出方式, System.out 和 System.err 两种选择 log4j.appender.cons.target=System.out # 设置为true,表示创建新的System.out 对象, 不使用System类中的out属性 log4j.appender.cons.follow=true log4j.appender.cons.layout=org.apache.log4j.SimpleLayout # ================================= 文件 日志记录 ================================ log4j.appender.myFile=org.apache.log4j.FileAppender # 文件存储路径 log4j.appender.myFile.file=./log.txt # 是否以追加的形式向日志文件中写入内容, 默认为true,不会覆盖之前的内容, 否则只会保留最后一次写入的日志 log4j.appender.myFile.append=false log4j.appender.myFile.layout=org.apache.log4j.SimpleLayout # =============================== 滚动文件 日志记录 ================================ # 当日志达到一定大小时, 将重新创建新文件记录日志 log4j.appender.myrFile=org.apache.log4j.RollingFileAppender log4j.appender.myrFile.file=./log.txt # 最多备份文件的个数,当文件大小超过设置的值时, 会将原内容进行备份。 # 该值指定了备份文件的个数, 如果超过数量, 则会删除掉最早的备份文件, 如果为0 则不进行备份 log4j.appender.myrFile.maxBackupIndex=5 # 每个文件的最大容量 默认单位是b, 可以指定 "KB", "MB" 或者 "GB", 当文件超过该大小时, 会将其进行备份(maxBackupIndex!=0) log4j.appender.myrFile.maxFileSize=1024 # 每个文件的最大容量, 类似于 maxFileSize, 不过是long类型, 即不可有单位, 单位是b log4j.appender.myrFile.maximumFileSize=1024 log4j.appender.myrFile.layout=org.apache.log4j.SimpleLayout # ============================== 每日滚动文件 日志记录 ================================ # 日志按天进行备份 log4j.appender.mydFile=org.apache.log4j.DailyRollingFileAppender # 前一天日志的备份文件的后缀格式(后缀为前一天日期,格式为日期格式) log4j.appender.mydFile.datePattern=yyyyMMdd # 当天的日志的记录文件路径 log4j.appender.mydFile.file=./nl.txt log4j.appender.mydFile.layout=org.apache.log4j.SimpleLayout # ================================= JDBC 日志记录 =============================== # 选择jdbc记录器 log4j.appender.jdbc=org.apache.log4j.jdbc.JDBCAppender # 驱动 log4j.appender.jdbc.driver=com.mysql.jdbc.Driver # 密码 log4j.appender.jdbc.password= # url log4j.appender.jdbc.URL=jdbc:mysql://localhost:3306/log # 用户名 log4j.appender.jdbc.user=root # 数据库插入语句 log4j.appender.jdbc.sql=insert into t_log values ('%m') # 布局 log4j.appender.jdbc.layout=org.apache.log4j.SimpleLayout 复制代码
格式 | 作用 |
---|---|
%p | 日志等级 |
%d | 日期 2018-6-26 16:05:19,555 |
%d{ymdhms自定义日期格式} | %d{yyyyMMddHHmmss} |
%r | 记录日志所消耗的时间 |
%C | 产生日志的包名.类名 |
%t | 产生日志的线程名 |
%m | 日志消息 |
%l | 产生日志的 包名.类名.方法名(类名:行数) |
%L | 行号 |
例如:
log4j.appender.cons.layout=org.apache.log4j.PatternLayout log4j.appender.cons.layout.ConversionPattern= [%p] %d %c - %m%n 复制代码
完整格式配置, 详见 官方API
您的点赞就是对小C最大的支持!也是小C继续分享的动力, 感谢各位的支持,谢谢