一、配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration> <!-- 将日志信息输出到控制台 -->
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
<!--过滤器设置输出的级别-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- 设置日志输出的最小级别 -->
<param name="levelMin" value="WARN" />
<!-- 设置日志输出的最大级别 -->
<param name="levelMax" value="ERROR" />
<!-- 设置日志输出的xxx,默认是false -->
<param name="AcceptOnMatch" value="true" />
</filter>
</appender> <!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
<appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
<!-- 设置日志信息输出文件全路径名 -->
<param name="File" value="D:/log4j/RollingFileAppender.log" />
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<!-- 设置保存备份回滚日志的最大个数 -->
<param name="MaxBackupIndex" value="10" />
<!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB -->
<param name="MaxFileSize" value="10KB" />
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
</appender> <!-- 将日志信息输出到文件,可以配置多久产生一个新的日志信息文件 -->
<appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<!-- 设置日志信息输出文件全路径名 -->
<param name="File" value="D:/log4j/DailyRollingFileAppender.log" />
<!-- 设置日志每分钟回滚一次,即产生一个新的日志文件 -->
<param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
</appender> <!--
注意:
1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明
2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志
2-2:当对应的logger含有包含关系时,比如:name=test.log4j.test8 和 name=test.log4j.test8.UseLog4j,则2-1的情况是一样的
2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称哟!注意啦!
3:logger中定义的level和appender中的filter定义的level的区间取交集
4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息
--> <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
<logger name="test.log4j.test8.UseLog4j" additivity="false">
<level value ="WARN"/>
<appender-ref ref="DailyRollingFileAppender"/>
</logger> <!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
<logger name="test.log4j.test8.UseLog4j_" additivity="false">
<level value ="ERROR"/>
<appender-ref ref="RollingFileAppender"/>
</logger> <!-- 根logger的设置-->
<root>
<level value ="INFO"/>
<appender-ref ref="ConsoleAppender"/>
<!--<appender-ref ref="DailyRollingFileAppender"/>-->
</root> </log4j:configuration>

若想配置打印mybatis sql语句,加入:

    <logger name="java.sql.Connection" additivity="true">
<level value="INFO" />
</logger> <logger name="java.sql.Statement" additivity="true">
<level value="INFO" />
</logger> <logger name="java.sql.PreparedStatement" additivity="true">
<level value="INFO" />
</logger> <logger name="java.sql.ResultSet" additivity="true">
<level value="INFO" />
</logger>

二、以自己项目为例:

自定义log4j日志级别及输出日志到不同文件.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n" />
</layout>
</appender> <appender name="log" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/route/route-trace-${log.name}.log" />
<param name="MaxFileSize" value="200000KB" />
<param name="MaxBackupIndex" value="100" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS}[%t][%c][%p]-%m%n" />
</layout>
</appender> <appender name="customAppend1" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/route/test-${log.nuw.name}.log" />
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB" />
<param name="MaxBackupIndex" value="2" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS}[%t][%c][%p]-%m%n" />
</layout>
<!--过滤器设置输出的级别 -->
<filter class="com.bankht.cis.tps.apps.support.log.CustomLogFilter">
<param name="levelMin" value="CUSTOMLEVEL1" />
<param name="levelMax" value="CUSTOMLEVEL1" />
</filter>
</appender> <appender name="customAppend2" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/route/test-${log.mcis.name}.log" />
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB" />
<param name="MaxBackupIndex" value="2" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS}[%t][%c][%p]-%m%n" />
</layout>
<!--过滤器设置输出的级别 -->
<filter class="com.bankht.cis.tps.apps.support.log.CustomLogFilter">
<param name="levelMin" value="CUSTOMLEVEL2" />
<param name="levelMax" value="CUSTOMLEVEL2" />
</filter>
</appender> <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
<logger name="java.sql.Connection" additivity="true">
<level value="INFO" />
</logger> <logger name="java.sql.Statement" additivity="true">
<level value="INFO" />
</logger> <logger name="java.sql.PreparedStatement" additivity="true">
<level value="INFO" />
</logger> <logger name="java.sql.ResultSet" additivity="true">
<level value="INFO" />
</logger> <!--
root的作用(相当于全局的意思):
1.[priority ]:指定默认的全局输出级别
2.[appender-ref ]:指定一些默认的append(没有指出特殊包或者类,即那些没有指定<logger>元素的append)的输出;
-->
<root>
<priority value="INFO" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="log" />
<appender-ref ref="customAppend1" />
<appender-ref ref="customAppend2" />
</root> </log4j:configuration>
CustomLog.java
package com.bankht.cis.tps.apps.support.log;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.net.SyslogAppender; /**
* 名称: CustomLog<br>
* 描述: name<br>
* 批次:name<br>
* 创建时间: 2018-2-9<br>
* 修改时间:<br>
* 编写人员:xxx<br>
* 版本号:1.0
*/
public class CustomLog { private static Logger logger = Logger.getLogger(CustomLog.class); /**
* 继承Level
* @author Sevencm
*
*/
private static class CustomLogLevel1 extends Level{
public CustomLogLevel1(int level, String levelStr, int syslogEquivalent) {
super(level, levelStr, syslogEquivalent);
}
}
private static class CustomLogLevel2 extends Level{
public CustomLogLevel2(int level, String levelStr, int syslogEquivalent) {
super(level, levelStr, syslogEquivalent);
}
} /**
* 自定义级别名称,以及级别范围
*/
private static final Level CUSTOMLEVEL1 = new CustomLogLevel1(20050,"CUSTOMLEVEL1",SyslogAppender.LOG_LOCAL0);
private static final Level CUSTOMLEVEL2 = new CustomLogLevel2(20051,"CUSTOMLEVEL2",SyslogAppender.LOG_LOCAL0); /**
* 使用日志打印logger中的log方法
*
* @param logger
* @param objLogInfo
*/
public static void customLog1(Logger logger,Object objLogInfo){
logger.log(CUSTOMLEVEL1, objLogInfo);
}
public static void customLog1(Object objLogInfo){
logger.log(CUSTOMLEVEL1, objLogInfo);
} public static void customLog2(Logger logger,Object objLogInfo){
logger.log(CUSTOMLEVEL2, objLogInfo);
}
public static void customLog2(Object objLogInfo){
logger.log(CUSTOMLEVEL2,objLogInfo);
}
}
CustomerLogFilter.java
package com.bankht.cis.tps.apps.support.log;

import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent; /**
* 名称: CustomerLogFilter.java<br>
* 描述: name<br>
* 批次:name<br>
* 创建时间: 2018-2-9<br>
* 修改时间:<br>
* 编写人员:xxx<br>
* 版本号:1.0
*/
public class CustomLogFilter extends Filter{
boolean acceptOnMatch = false;
private String levelMin;
private String levelMax; public String getLevelMin() {
return levelMin;
} public void setLevelMin(String levelMin) {
this.levelMin = levelMin;
} public String getLevelMax() {
return levelMax;
} public void setLevelMax(String levelMax) {
this.levelMax = levelMax;
} public boolean isAcceptOnMatch() {
return acceptOnMatch;
} public void setAcceptOnMatch(boolean acceptOnMatch) {
this.acceptOnMatch = acceptOnMatch;
} @Override
public int decide(LoggingEvent lgEvent) {
int inputLevel = lgEvent.getLevel().toInt(); if(inputLevel>=getLevel(levelMin) && inputLevel <= getLevel(levelMax)){
return 0;
} return -1;
} private int getLevel(String level){
level = level.toUpperCase();
if(level.equals("CUSTOMLEVEL1")){
return LevelType.CUSTOMLEVEL1.getType();
}
if(level.equals("CUSTOMLEVEL2")){
return LevelType.CUSTOMLEVEL2.getType();
}
if(level.equals("OFF")){
return LevelType.OFF.getType();
}
if(level.equals("FATAL")){
return LevelType.FATAL.getType();
}
if(level.equals("ERROR")){
return LevelType.ERROR.getType();
}
if(level.equals("INFO")){
return LevelType.INFO.getType();
}
if(level.equals("WARN")){
return LevelType.WARN.getType();
}
if(level.equals("DEBUG")){
return LevelType.DEBUG.getType();
}
if(level.equals("ALL")){
return LevelType.ALL.getType();
}
return LevelType.OFF.getType();
} private static enum LevelType{ OFF(2147483647), FATAL(50000), ERROR(40000), WARN(30000), INFO(20000), DEBUG(10000), ALL(-2147483648), CUSTOMLEVEL1(20050),
CUSTOMLEVEL2(20051); int type; public int getType() {
return type;
} private LevelType(int type) {
this.type = type;
}
}
}

测试类:

package com.bankht.cis.tps.apps.support.log;

/**
* 名称: LogTest.java<br>
* 描述: name<br>
* 批次:name<br>
* 创建时间: 2018-2-1<br>
* 修改时间:<br>
* 编写人员:xxx <br>
* 版本号:1.0 */
public class LogTest { public static void main(String[] args) {
System.setProperty("log.nuw.name", "xxx");//自定义文件名
System.setProperty("log.mcis.name", "gagaga");//自定义文件名
CustomLog log = new CustomLog();
log.customLog1("------------------20180211---nuwGAGAGA");
log.customLog2("------------------20180211---mcisYAYAYYAYA");
} }

log4j.xml配置,包含自定义log4j日志级别及输出日志到不同文件的更多相关文章

  1. 有效Log4j按指定级别定向输出日志到指定的输出文件地址配置Threshold,log4j中如何屏蔽父logger输出源rootlogger的additivity配置,log4j向多个文件记录日志

    log4j向多个文件记录日志 关键配置,指定想要的日志级别信息输出到指定的日志文件中: log4j.appender.errorLogger.Threshold=ERROR #扩展,可指定只在子类自己 ...

  2. log4j.properties和log4j.xml配置

    >>>>1. 概述<<<< 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统 ...

  3. Log4j XML配置

    问题描述:     Log4j  XML配置 问题解决:     (1)编写log4j.xml配置文件 注:     如上的XML文件必须以log4j.xml文件命名,否则无法读取配置文件,同样的如果 ...

  4. Log4j.xml配置(rolling示例)

    Log4j.xml配置(很详细) <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4 ...

  5. 应验log4j.xml时不能找到log4j.dtd

    原因分析:log4j.xml中使用log4j的DTD验证其格式的有效性"<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd&quo ...

  6. DWR日志 在log4j.xml配置

    一.日志 DWR依赖 Apache Commons Logging,可以使用log4j实现日志记录功能. 1.1 日志简介 和其他日志框架一样,当设置低等级的日志时所有高于此等级的日志也将会打印出来. ...

  7. log4j.xml配置示例

    这是log4j1.x版本讲解,log4j-1.2.16.jar    1. 一般的log4j.xml的两种配置方式: 1.Logger 完成日志信息的处理定义输出的层次和决定信息是否输出DEBUG&l ...

  8. Log4J.xml配置详解

    原文地址:https://blog.csdn.net/genyizha/article/details/74502812 Appender Appender:日志输出器,配置日志的输出级别.输出位置等 ...

  9. Log4j XML 配置

    Xml代码 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configurat ...

随机推荐

  1. python加速

    之前一直用 conda版python, 发现可以直接装intel的numpy了. https://software.intel.com/en-us/articles/installing-the-in ...

  2. 爬虫—GEETEST滑动验证码识别

    一.准备工作 本次使用Selenium,浏览器为Chrome,并配置好ChromDriver 二.分析 1.模拟点击验证按钮:可以直接使用Selenium完成.    2.识别滑块的缺口位置:先观察图 ...

  3. VirtualBox虚拟机下Linux CentOS6.9安装增强功能

     VirtualBox安装CentOS后,再安装增强功能就可以共享文件夹.粘贴板以及鼠标无缝移动,主要步骤如下: 1.yum -y update 2.yum -y install g++ gcc gc ...

  4. restful的简单使用

    根据http的不同方法,访问不同路由的相同控制器下的不同方法可以实现restful的使用 分别对应 路由方式 get put delete post 对应操作 获取 更新 删除 添加 其中如果要在非l ...

  5. iOS开发-消息初认识

    一.消息循环(runLoop)的作用 1,防止程序退出, 2,接受事件 3,如果没有事件,让程序自动休眠   二.消息源    1, 输入源:键盘.鼠标.NSBoard.NSPort    2,定时源 ...

  6. POJ-2349 Arctic Network(最小生成树+减免路径)

    http://poj.org/problem?id=2349 Description The Department of National Defence (DND) wishes to connec ...

  7. 论文翻译——Dynamic Pooling and Unfolding Recursive Autoencoders for Paraphrase Detection

    Dynamic Pooling and Unfolding Recursive Autoencoders for Paraphrase Detection 动态池和展开递归自动编码器的意译检测 论文地 ...

  8. Angular ng-container ng-template 用法

    ng-container本身不创建任何html代码,相当于一个容器. <ng-container *ngFor="let item of dataSource;let i=index& ...

  9. Linux常见指令x-mind

  10. Spring Boot 默认的指标数据从哪来的?

    了解有关 Spring Boot 默认指标及其来源的更多信息. 您是否注意到 Spring Boot 和 Micrometer 为您的应用生成的所有默认指标?如果没有 - 您可以将 actuator  ...