<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders 日志信息输出目的地 -->
<!-- ConsoleAppender -->
<!-- 每个ConsoleAppender都有一个target,表示它的输出目的地。 -->
<!-- 它可以是System.out,标准输出设备(缓冲显示屏) -->
<!-- 或者是System.err,标准错误设备(不缓冲显示屏) -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%l - %c:%m %d [%-5p]%n" />
</layout>
</appender>
<!-- RollingFileAppender 回滚文件 -->
<!-- Append true,默认每次启动系统,日志继续输出到原来的文件,而不是清空了再来 -->
<!-- MaxFileSize 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件 -->
<!-- MaxBackupIndex 最多20个 -->
<!-- PatternLayout 控制日志输出的格式化,参考上面的那些符合说明,自己怼自己想要的格式。-->
<!-- filter 级别范围过滤器 -->
<!-- levelMin levelMax 范围 -->
<appender name="StreamOperateFile" class="org.apache.log4j.RollingFileAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%l - %c:%m %d [%-5p]%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="INFO" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- 下面这些就是根据 这些路径来控制对应包下的文件的日志输出级别,基本上都是报错了,才输出日志 -->
<logger name="org.springframework.core">
<level value="error" />
</logger>
<logger name="org.springframework.beans">
<level value="error" />
</logger>
<logger name="org.springframework.context">
<level value="error" />
</logger>
<logger name="org.springframework.http">
<level value="error" />
</logger>
<logger name="org.springframework.web">
<level value="error" />
</logger>
<logger name="org.elasticsearch.client.transport">
<level value="debug" />
</logger>
<logger name="org.springframework.data.mongodb">
<level value="error" />
</logger>
<!-- logger 输出级别是info级别及以上的日志,下面的ref关联的两个appender没有filter设置,所以,info及以上的日志都是会输出到这2个appender的 -->
<root>
<priority value="info" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
<!--
格式参数:
-X号: X信息输出时左对齐;
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
-->
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.xml.DOMConfigurator;
import org.slf4j.LoggerFactory;
public class Log4jTest {
// private static org.slf4j.Logger logger = LoggerFactory.getLogger(Log4jTest.class);
private static SimpleDateFormat date = new SimpleDateFormat();
public static void main(String[] args) {
Logger logger = getLog(Log4jTest.class);
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
logger.error("This is error message.");
}
public static Logger getLog(Class<?> clazz) {
Logger logger = Logger.getLogger(clazz); // 生成新的Logger
logger.removeAllAppenders(); // 清空Appender,特別是不想使用現存實例時一定要初期化
logger.setLevel(Level.DEBUG); // 设定Logger級別。
logger.setAdditivity(true); // 设定是否继承父Logger。默认为true,继承root输出;设定false后将不出书root。
FileAppender appender = new RollingFileAppender(); // 生成新的Appender
appender.setFile("D:/"+getTime("yyyy-MM-dd") + ".log"); // log输出路径
appender.setEncoding("UTF-8"); // log的字符编码
appender.setAppend(true); //日志合并方式: true:在已存在log文件后面追加 false:新log覆盖以前的log
appender.activateOptions(); // 适用当前配置
PatternLayout layout = new PatternLayout();
layout.setConversionPattern("%l - %c:%m %d [%-5p]%n"); // log的输出形式
appender.setLayout(layout);
logger.addAppender(appender); // 将新的Appender加到Logger中
return logger;
}
private static String getTime(String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(new Date());
}
}