一.log4j简介:
log4j官方下载地址:jakarta.apache.org/log4j
log4j是Apache的一个开源日志组件,可以为我们提供非常强大又便捷的日志记录。
log4j日志有七个等级:all<debug<info<warn<error<fatal<off
二.log4j配置:
不同类型的项目引入log4j的方式是不同的。
但是需要配置的内容是大致一样的(日志级别、日志格式和记录显示/保存位置等)。
1.在Maven项目中
1.1.在maven中引入log4j的依赖
1.2.在src/main/java中创建log4j.properties配置文件
1.3.在java文件中使用log4j进行日志记录
//在Maven项目中的依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
//log4j.properties配置文件
log4j.rootLogger = INFO,console //定义输出器等级和名字
log4j.additivity.org.apache = true //表示不会在父logger中的appender输出,默认true
#console
log4j.appender.console = org.apache.log4j.ConsoleAppender //指定logger的输出位置
log4j.appender.console.Threshold = INFO //指定日志的最低级别,默认DEBUG
log4j.appender.console.ImmediateFlush = true //表示所有信息都会被立即输出
log4j.appender.console.Target=System.out //默认值为System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout //指定输出内容及格式
//输出日志时间点的时间或日期,默认格式为ISO8601
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m%n
#在JAVA文件中使用log4j记录日志
public class MainTest(){
public static void main(String[] args){
new Test.test();
}
}
public class Test(){
final Logger logger = Logger.getLogger(MainTest.class);
public void test(){
logger.info("hello world");
}
}
2.在普通java/spring项目中
2.1.将log4j的jar包通过build path引入项目
2.2.在src/main/java下创建log4j.properties配置文件
2.3.在JAVA文件中使用log4j进行日志记录
3.在SpringMVC项目中
3.1.在src/main/resources的conf目录下创建log4j.properties文件
3.2.编辑项目的web.xml文件
//编辑项目的web.xml文件 添加以下内容
<context-parm>
<parm-name>log4jConfigLocation</parm-name>
<parm-value>classpath:/conf/log4j.properties</parm-value>
</context-parm>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
4.在普通的Web项目中
因为普通的项目中没有了Spring提供的listener来加载log4j了,所以需要使用servlet来加载
4.1.在src/main/resources/conf下创建log4j.properties文件
4.2.编辑项目的web.xml文件
//使用servlet来加载log4j
public class Log4jServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException{
String perfix = this.getClass().getClassLoader().getResources("/").getPath();
String path = config.getInitParameter("log4j-path");
PopertyConfigurator.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文件 添加如下内容
<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>
三.log4j的配置说明
1.logger:日志实例,指的是代码里实例化的log4j(Logger)对象
log4j.rootLogger = LEVEL,appenderName1,appenderName2... //定义Logger实例化对象
log4j.additivity.org.apache = false; //表示不会在父logger的appender里输出,默认true
例: log4j.logger.com.demo.test = BEBUG,test
log4j.additivity.com.demo.test = false
2.appender:日志输出器,指定logger的输出位置
log4j.appender.appenderName = className
//className有五种值可以选择,每个都有不同的配置
1.org.apache.log4j.ConsoleAppender //控制台
Threshold=WARN:指定日志信息的最低输出级别,默认DEBUG
ImmediateFlush=true:所有消息都会被立即输出,false则不输出,默认值是true
Target=System.err:默认值是System.out
2.org.apache.log4j.FileAppender //文件
Threshold=WARN:指定日志信息的最低输出级别,默认DEBUG
ImmediateFlush=true:所有消息都会被立即输出,false则不输出,默认true
Append=false:true消息增加到指定文件中,false将消息覆盖指定文件,默认true
File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件
3.org.apache.log4j.DailyRollingFileAppender //每天产生一个日志文件
Threshold=WARN:指定日志信息的最低输出级别,默认DEBUG
ImmediateFlush=true:所有消息都会被立即输出,false则不输出,默认true
Append=false:true消息增加到指定文件中,false将消息覆盖指定文件,默认true
File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件
DatePattern='.'yyyy-MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为logging.log4j,前一个月的日志文件名 ('.'yyyy-MM:每月 / '.'yyyy-ww:每周 / '.'yyyy-MM-dd:每天 / '.'yyyy-MM-dd-a:每天两次 / '.'yyyy-MM-dd-HH:每小时 / '.'yyyy-MM-dd-HH-mm:每分钟 )
4.org.apache.log4j.RollingFileAppender //文件大小到达指定尺寸的时候产生一个新的文件
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文件
5.org.apache.log4j.WriterAppender //将日志信息以流格式发送到任意指定的地方
3.layout:指定logger输出内容及格式
log4j.appender.appenderName.layout = calssName
//layout的className有四种选择
1.org.apache.log4j.HTMLLayout //以HTML表格形式布局
LocationInfo=true:输出java文件名称和行号,默认false
Title=My Logging: 默认值是Log4J Log Messages
2.org.apache.log4j.PatternLayout //可以灵活地指定布局模式
ConversionPattern=%m%n:设定以怎样的格式显示消息
3.org.apache.log4j.SimpleLayout //包含日志信息的级别和信息字符串
4.org.apache.log4j.TTCCLayout //包含日志产生的时间、线程、类别等信息
四.log4j全局配置
在配置了全局的log4j之后,整个项目都使用了同一套配置,也就是说所有的日志都在同一个地方,所有的信息都混在一起。
log4j.rootLogger=DEBUG,console,dailyFile,rollingFile,logFile
log4j.additivity.org.apache=true
#控制台日志输出器
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
#文件日志输出器
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
#滚动文件日志输出器
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
#定期滚动文件日志输出器
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
五.log4j局部配置
如果想要为不同的包或者类单独的输出日志,那么就需要定义多个局部配置
#定义局部的log4j文件输出器
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
//可以让同一个类输出不同类型的日志文件
//可以初始化两个日志对象
private static Log logger1 = LogFactory.getLog("myTest1");
private static Log logger2 = LogFactory.getLog("myTest2");
#分别配置量两个log4j实例
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
1.slf4j简介:
slf4j运用了典型的门面模式思想,和JVM的思想是一样的,即当一个项目中依赖了多个日志框架的时候,slf4j就负责帮我们处理这些日志实现框架的差异。
2.slf4j使用:
2.1.在项目中添加slf4j的依赖
2.2.在项目中添加slf4j和不同日志实现框架的转换(关联)依赖
//slf4j的依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
//slf4j和log4j的关联jar包
//通过这个jar包,把对slf4j接口的调用转为对log4j的调用
//不同的日志实现框架,这个转换工具不同
//slf4j-log4j12依赖了slf4j和log4j,所以只使用这个依赖就可以满足需求
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
//在JAVA类中使用slf4j和log4j的方式
class Test{
Logger log = LoggerFactory.getLogger(Test.calss);
public void test(){
log.info("hello {}",world); //slf4j中可以使用占位符
}
}
原文:https://blog.csdn.net/qq_42072311/article/details/80923512