[转载]java日志框架log4j详细配置及与slf4j联合使用教程

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一、log4j基本用法  首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path”12345    log4j    log4j    1.

一、log4j基本用法

1
2
3
4
5
< dependency >
     < groupId >log4j</ groupId >
     < artifactId >log4j</ artifactId >
     < version >1.2.17</ version >
</ dependency >

  然后,在src/main/java目录(包的根目录即classpath)新建log4j.properties文件

1
2
3
4
5
6
7
8
9
log4j.rootLogger = INFO,console
log4j.additivity.org.apache = true
#console
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold = INFO
log4j.appender.console.ImmediateFlush = true
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p]  % m % n

  最后,新建Main.java文件

1
2
3
4
5
6
7
8
9
10
11
12
13
package  com.xmyself.log4j;
import  org.apache.log4j.Logger;
public  class  Main {
     public  static  void  main(String[] args) {
         new  Test().test();
     }
}
class  Test {
     final  Logger log = Logger.getLogger(Test. class );
     public  void  test() {
         log.info( "hello this is log4j info log" );
     }
}

  运行main方法,日志信息就出来了

1
2016-12-01 21:23:29 [INFO] hello this is log4j info log

二、log4j.properties路径

  log4j.properties要放在哪以及怎样配置才能被解析呢?不同工程类型配置方式不同

1、普通java或spring工程

  这是最常见的java工程类型,写demo用的多,把log4j.properties放在src/main/java目录(包的根目录)就行了

2、spring mvc工程

  web工程里用spring mvc构建的比较多了,把log4j.properties放在src/main/resources的conf目录(web工程配置文件通常在resources或WEB-INF目录),编辑web.xml,添加

1
2
3
4
5
6
7
< context-param >
     < param-name >log4jConfigLocation</ param-name >
     < param-value >classpath:/conf/log4j.properties</ param-value >
</ context-param >
< listener >
     < listener-class >org.springframework.web.util.Log4jConfigListener</ listener-class >
</ listener >

3、普通web工程

  没有了spring提供的listener加载log4j.properties,我们要怎么加载这个文件呢?同样,把log4j.properties放在src/main/resources的conf目录,用servlet加载

1
2
3
4
5
6
7
8
9
10
11
12
public  class  Log4jServlet  extends  HttpServlet {
     private  static  final  long  serialVersionUID = 1L;
  
     public  void  init(ServletConfig config)  throws  ServletException {
         String prefix =  this .getClass().getClassLoader().getResource( "/" ).getPath();
         String path = config.getInitParameter( "log4j-path" );
         PropertyConfigurator.configure(prefix + path);
     }
     public  void  doGet(HttpServletRequest req, HttpServletResponse res)  throws  IOException, ServletException {}
     public  void  doPost(HttpServletRequest req, HttpServletResponse res)  throws  IOException, ServletException {}
     public  void  destroy() {}
}

  编辑web.xml,添加

1
2
3
4
5
6
7
8
9
< servlet >
     < servlet-name >log4j</ servlet-name >
     < servlet-class >com.xmyself.log4j.Log4jServlet</ servlet-class >
     < init-param >
         < param-name >log4j-path</ param-name >
         < param-value >conf/log4j.properties</ param-value >
     </ init-param >
     < load-on-startup >1</ load-on-startup >
</ servlet >

  看着是不是和spring mvc的很像,甚至你也想到了,普通java工程没有指定log4j.properties的路径,那说明log4j的jar包一定有一个默认的路径。另外,建议,log4j的配置放在第一个,因为后续加载其他组件就要开始使用日志记录了

  现在,你可以在多种类型的java工程中打出日志了,但都是控制台的日志,输出内容也很有限,下面我们就来详细介绍log4j.properties内容怎么配置

三、log4j.properties内容

  接下来介绍的内容看起来独立,其实相互关联,并且很有规律,我们要输出日志,首先得有日志对象(logger),那这些日志对象把日志输出到哪里呢,控制台还是文件,这就要设置输出位置(appender),输出的格式与内容又是什么样的呢,这就要设置输出样式(layout),这些设置完,log4j的配置也就完了

  在此之前,先介绍下log4j日志等级的概念,日志等级就是日志的重要程度,log4j日志分为7个等级:ALL、DEBUG、INFO、WARN、ERROR、FATAL、OFF,从左到右等级由低到高,分等级是为了设置日志输出的门槛,只有等级等于或高于这个门槛的日志才有机会输出

1、logger

  日志实例,就是代码里实例化的Logger对象

1
2
log4j.rootLogger = LEVEL,appenderName1,appenderName2,...
log4j.additivity.org.apache = false:表示不会在父logger的appender里输出,默认true

  这是全局logger的配置,LEVEL用来设定日志等级,appenderName定义日志输出器,示例中的“console”就是一个日志输出器

  下面给出一个更清晰的例子,配置“com.demo.test”包下所有类中实例化的Logger对象

1
2
log4j.logger.com.demo.test = DEBUG,test
log4j.additivity.com.demo.test = false

2、appender

  日志输出器,指定logger的输出位置

1
log4j.appender.appenderName = className

  appender有5种选择

1
2
3
4
5
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

  每种appender都有若干配置项,下面逐一介绍

  ConsoleAppender(常用)

1
2
3
Threshold = WARN:指定日志信息的最低输出级别,默认DEBUG
ImmediateFlush = true:表示所有消息都会被立即输出,设为false则不输出,默认值是true
Target = System.err:默认值是System.out

  FileAppender

1
2
3
4
Threshold = WARN:指定日志信息的最低输出级别,默认DEBUG
ImmediateFlush = true:表示所有消息都会被立即输出,设为false则不输出,默认true
Append = false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认true
File = D: / logs / logging.log4j:指定消息输出到logging.log4j文件

  DailyRollingFileAppender(常用)

1
2
3
4
5
6
7
8
9
10
11
12
Threshold = WARN:指定日志信息的最低输出级别,默认DEBUG
ImmediateFlush = true:表示所有消息都会被立即输出,设为false则不输出,默认true
Append = false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认true
File = D: / logs / logging.log4j:指定当前消息输出到logging.log4j文件
DatePattern = '.' yyyy - MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为logging.log4j,前一个月的日志文件名为logging.log4j.yyyy - MM
另外,也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:
1 ) '.' yyyy - MM:每月
2 ) '.' yyyy - ww:每周
3 ) '.' yyyy - MM - dd:每天
4 ) '.' yyyy - MM - dd - a:每天两次
5 ) '.' yyyy - MM - dd - HH:每小时
6 ) '.' yyyy - MM - dd - HH - mm:每分钟

  RollingFileAppender

1
2
3
4
5
6
Threshold = WARN:指定日志信息的最低输出级别,默认DEBUG
ImmediateFlush = true:表示所有消息都会被立即输出,设为false则不输出,默认true
Append = false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认true
File = D: / logs / logging.log4j:指定消息输出到logging.log4j文件
MaxFileSize = 100KB :后缀可以是KB,MB或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j. 1 文件
MaxBackupIndex = 2 :指定可以产生的滚动文件的最大数,例如,设为 2 则可以产生logging.log4j. 1 ,logging.log4j. 2 两个滚动文件和一个logging.log4j文件

3、layout

  指定logger输出内容及格式

1
log4j.appender.appenderName.layout = className

  layout有4种选择

1
2
3
4
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)

  layout也有配置项,下面具体介绍

  HTMLLayout

1
2
LocationInfo = true:输出java文件名称和行号,默认false
Title = My Logging: 默认值是Log4J Log Messages

  PatternLayout(最常用的配置)

1
ConversionPattern = % m % n:设定以怎样的格式显示消息

  设置格式的参数说明如下

1
2
3
4
5
6
7
8
9
10
11
12
13
% p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL
% d:输出日志时间点的日期或时间,默认格式为ISO8601,可以指定格式如: % d{yyyy / MM / dd HH:mm:ss,SSS}
% r:输出自应用程序启动到输出该log信息耗费的毫秒数
% t:输出产生该日志事件的线程名
% l:输出日志事件的发生位置,相当于 % c. % M( % F: % L)的组合,包括类全名、方法、文件名以及在代码中的行数
% c:输出日志信息所属的类目,通常就是类全名
% M:输出产生日志信息的方法名
% F:输出日志消息产生时所在的文件名
% L:输出代码中的行号
% m:输出代码中指定的具体日志信息
% n:输出一个回车换行符,Windows平台为 "rn" ,Unix平台为 "n"
% x:输出和当前线程相关联的NDC(嵌套诊断环境)
% % :输出一个 "%" 字符

四、log4j完整配置示例

  介绍完了log4j.properties内容,我们来配置一些常用的日志输出吧

1
2
log4j.rootLogger = DEBUG,console,dailyFile,rollingFile,logFile
log4j.additivity.org.apache = true

  控制台console日志输出器

1
2
3
4
5
6
7
# 控制台(console)
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.ImmediateFlush = true
log4j.appender.console.Target = System.err
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p]  % m % n

  文件logFile日志输出器

1
2
3
4
5
6
7
8
# 日志文件(logFile)
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold = DEBUG
log4j.appender.logFile.ImmediateFlush = true
log4j.appender.logFile.Append = true
log4j.appender.logFile. File = D: / logs / log.log4j
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p]  % m % n

  滚动文件rollingFile日志输出器

1
2
3
4
5
6
7
8
9
10
# 滚动文件(rollingFile)
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold = DEBUG
log4j.appender.rollingFile.ImmediateFlush = true
log4j.appender.rollingFile.Append = true
log4j.appender.rollingFile. File = D: / logs / log.log4j
log4j.appender.rollingFile.MaxFileSize = 200KB
log4j.appender.rollingFile.MaxBackupIndex = 50
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p]  % m % n

  定期滚动文件dailyFile日志输出器

1
2
3
4
5
6
7
8
9
# 定期滚动日志文件(dailyFile)
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold = DEBUG
log4j.appender.dailyFile.ImmediateFlush = true
log4j.appender.dailyFile.Append = true
log4j.appender.dailyFile. File = D: / logs / log.log4j
log4j.appender.dailyFile.DatePattern = '.' yyyy - MM - dd
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p]  % m % n

五、log4j局部日志配置

  以上介绍的配置都是全局的,整个工程的代码使用同一套配置,意味着所有的日志都输出在了相同的地方,你无法直接了当的去看数据库访问日志、用户登录日志、操作日志,它们都混在一起,因此,需要为包甚至是类配置单独的日志输出,下面给出一个例子,为“com.demo.test”包指定日志输出器“test”,“com.demo.test”包下所有类的日志都将输出到/log/test.log文件

1
2
3
4
5
log4j.logger.com.demo.test = DEBUG,test
log4j.appender.test = org.apache.log4j.FileAppender
log4j.appender.test. File = / log / test.log
log4j.appender.test.layout = org.apache.log4j.PatternLayout
log4j.appender.test.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p]  % m % n

  也可以让同一个类输出不同的日志,为达到这个目的,需要在这个类中实例化两个logger

1
2
private  static  Log logger1 = LogFactory.getLog( "myTest1" );
private  static  Log logger2 = LogFactory.getLog( "myTest2" );

  然后分别配置

1
2
3
4
5
6
7
8
9
10
11
12
log4j.logger.myTest1 =  DEBUG,test1
log4j.additivity.myTest1 = false
log4j.appender.test1 = org.apache.log4j.FileAppender
log4j.appender.test1. File = / log / test1.log
log4j.appender.test1.layout = org.apache.log4j.PatternLayout
log4j.appender.test1.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p]  % m % n
  
log4j.logger.myTest2 = DEBUG,test2
log4j.appender.test2 = org.apache.log4j.FileAppender
log4j.appender.test2. File = / log / test2.log
log4j.appender.test2.layout = org.apache.log4j.PatternLayout
log4j.appender.test2.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p]  % m % n

六、slf4j与log4j联合使用

  slf4j是什么?slf4j只是定义了一组日志接口,但并未提供任何实现,既然这样,为什么要用slf4j呢?log4j不是已经满足要求了吗?

  是的,log4j满足了要求,但是,日志框架并不只有log4j一个,你喜欢用log4j,有的人可能更喜欢logback,有的人甚至用jdk自带的日志框架,这种情况下,如果你要依赖别人的jar,整个系统就用了两个日志框架,如果你依赖10个jar,每个jar用的日志框架都不同,岂不是一个工程用了10个日志框架,那就乱了!

  如果你的代码使用slf4j的接口,具体日志实现框架你喜欢用log4j,其他人的代码也用slf4j的接口,具体实现未知,那你依赖其他人jar包时,整个工程就只会用到log4j日志框架,这是一种典型的门面模式应用,与jvm思想相同,我们面向slf4j写日志代码,slf4j处理具体日志实现框架之间的差异,正如我们面向jvm写java代码,jvm处理操作系统之间的差异,结果就是,一处编写,到处运行。况且,现在越来越多的开源工具都在用slf4j了

  那么,怎么用slf4j呢?

  首先,得弄到slf4j的jar包,maven依赖如下,log4j配置过程完全不变

1
2
3
4
5
< dependency >
     < groupId >org.slf4j</ groupId >
     < artifactId >slf4j-api</ artifactId >
     < version >1.7.21</ version >
</ dependency >

  然后,弄到slf4j与log4j的关联jar包,通过这个东西,将对slf4j接口的调用转换为对log4j的调用,不同的日志实现框架,这个转换工具不同

1
2
3
4
5
< dependency >
     < groupId >org.slf4j</ groupId >
     < artifactId >slf4j-log4j12</ artifactId >
     < version >1.7.21</ version >
</ dependency >

  当然了,slf4j-log4j12这个包肯定依赖了slf4j和log4j,所以使用slf4j+log4j的组合只要配置上面这一个依赖就够了

  最后,代码里声明logger要改一下,原来使用log4j是这样的

1
2
3
4
5
6
7
import  org.apache.log4j.Logger;
class  Test {
     final  Logger log = Logger.getLogger(Test. class );
     public  void  test() {
         log.info( "hello this is log4j info log" );
     }
}

  现在要改成这样

1
2
3
4
5
6
7
8
import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
class  Test {
     Logger log = LoggerFactory.getLogger(Test. class );
     public  void  test() {
         log.info( "hello, my name is {}" "chengyi" );
     }
}

  依赖的Logger变了,而且,slf4j的api还能使用占位符,很方便

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
27天前
|
自然语言处理 前端开发 Java
JBoltAI 框架完整实操案例 在 Java 生态中快速构建大模型应用全流程实战指南
本案例基于JBoltAI框架,展示如何快速构建Java生态中的大模型应用——智能客服系统。系统面向电商平台,具备自动回答常见问题、意图识别、多轮对话理解及复杂问题转接人工等功能。采用Spring Boot+JBoltAI架构,集成向量数据库与大模型(如文心一言或通义千问)。内容涵盖需求分析、环境搭建、代码实现(知识库管理、核心服务、REST API)、前端界面开发及部署测试全流程,助你高效掌握大模型应用开发。
155 5
|
28天前
|
资源调度 安全 Java
Java 大数据在智能教育在线实验室设备管理与实验资源优化配置中的应用实践
本文探讨Java大数据技术在智能教育在线实验室设备管理与资源优化中的应用。通过统一接入异构设备、构建四层实时处理管道及安全防护双体系,显著提升设备利用率与实验效率。某“双一流”高校实践显示,设备利用率从41%升至89%,等待时间缩短78%。该方案降低管理成本,为教育数字化转型提供技术支持。
60 0
|
4月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
262 0
|
3月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
309 70
|
1月前
|
Oracle Java 关系型数据库
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
156 2
|
1月前
|
存储 安全 Java
现代应用场景中 Java 集合框架的核心技术与实践要点
本内容聚焦Java 17及最新技术趋势,通过实例解析Java集合框架的高级用法与性能优化。涵盖Record类简化数据模型、集合工厂方法创建不可变集合、HashMap初始容量调优、ConcurrentHashMap高效并发处理、Stream API复杂数据操作与并行流、TreeMap自定义排序等核心知识点。同时引入JMH微基准测试与VisualVM工具分析性能,总结现代集合框架最佳实践,如泛型使用、合适集合类型选择及线程安全策略。结合实际案例,助你深入掌握Java集合框架的高效应用与优化技巧。
74 4
|
3月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
124 24
|
4月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
255 13
|
4月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
4月前
|
缓存 Java 编译器

热门文章

最新文章