log4j配置文件详解

 1. 日志级别
    (1) 根类别(在类别层次结构的顶部,即全局性的日志级别)
    log4j.rootLogger=[level],[appenderName],[appenderName],...
    类别level 为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先级。
    log4j常用的优先级FATAL>ERROR>WARN>INFO>DEBUG
    举例:
    log4j.rootLogger=WARN,则意味着只有WARN,ERROR,FATAL被输出,DEBUG,INFO将被屏蔽掉。
    log4j.rootCategory=INFO,stdout,Runlog,Errorlog  根日志类别为INFO,DEBUG将被屏蔽,其他的将被输出。 stdout,Runlog,Errorlog分别为3个输出目的地。
   (2) 指定类及包下的日志级别
    log4j.logger.[类全路径]=[level],[appenderName],[appenderName],...    
2. 配置日志信息输出目的地 log4j.appender.[appenderName]
    value值有如下:
        org.apache.log4j.ConsoleAppender             控制台
        org.apache.log4j.FileAppender                 文件
        org.apache.log4j.DailyRollingFileAppender     每天产生一个日志文件
        org.apache.log4j.RollingFileAppender         文件大小到达指定尺寸的时候产生一个新的文件
        org.apache.log4j.WriterAppender             将日志信息以流格式发送到任意指定的地方
        org.apache.log4j.net.SMTPAppender             邮件
        org.apache.log4j.jdbc.JDBCAppender             数据库
3. 输出日志布局    log4j.appender.[appenderName].layout
    value值有如下:
        org.apache.log4j.HTMLLayout        以HTML表格形式布局
        org.apache.log4j.PatternLayout    可以灵活地指定布局模式
        org.apache.log4j.SimpleLayout    包含日志信息的级别和信息字符串
        org.apache.log4j.TTCCLayout        包含日志产生的时间、线程、类别等等信息
4. 日志输出格式        log4j.appender.[appenderName].layout.ConversionPattern
    value值为: %5p %d{yyyy-MM-dd HH:mm:ss}  %c %m %n
        -X号:X信息输出时左对齐;
        %p:日志信息级别;
        %d{}:日志信息产生时间;
        %c:日志信息所在地(类名);
        %m:产生的日志具体信息;
        %n:输出日志信息换行
5. 输出配置
    #在这配全局日志级别和各输出方式的appenderName

 log4j.rootLogger=INFO,CONSOLE,ROLLING_FILE,FILE,MAIL,DATABASE

(1) 控制台输出

    #设置控制台输出
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    #输出模式 System.err/System.out:默认值是System.out。
    log4j.appender.CONSOLE.Target=System.out
    #指定级别
    log4j.appender.CONSOLE.Threshold=INFO
    #指定布局
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    #指定格式
    log4j.appender.CONSOLE.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss}  %c %m %n

(2) 输出到文件

    #设置日志文件输出
    log4j.appender.FILE=org.apache.log4j.FileAppender
    #指定输出的路径及文件名
    log4j.appender.FILE.File=D:/file.log
    #追加设置 为true重启项目不删除以前日志
    log4j.appender.FILE.Append=false
    #指定级别
    log4j.appender.FILE.Threshold=ERROR
    #布局及输出格式
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILE.layout.ConversionPattern=[%p] %d - %c -%-4r [%t] %-5p %c %x - %m%n

(3) 输出到文件(设置大小)

    #设置输出类型
    log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
    #指定级别
    log4j.appender.ROLLING_FILE.Threshold=INFO
    #指定输出的路径及文件名
    log4j.appender.ROLLING_FILE.File=D:/file1.log
    #追加设置 为true重启项目不删除以前日志
    log4j.appender.ROLLING_FILE.Append=true
    #指定文件大小
    log4j.appender.ROLLING_FILE.MaxFileSize=2KB
    #指定新建日志文件数量
    log4j.appender.ROLLING_FILE.MaxBackupIndex=3
    #布局及输出格式
    log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.ROLLING_FILE.layout.ConversionPattern=[%p] %d - %c -%-4r [%t] %-5p %c %x - %m%n

(4) 输出到邮件

    #配置输出类型
    log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
    #配置级别
    log4j.appender.MAIL.Threshold=FATAL
    #配置流大小
    log4j.appender.MAIL.BufferSize=10
    #设置发件人
    log4j.appender.MAIL.From=****@**.com
    #设置SMTP服务器
    log4j.appender.MAIL.SMTPHost=mail.**.com
    #设置主题
    log4j.appender.MAIL.Subject=Log4J Message
    #设置收件人
    log4j.appender.MAIL.To=****@**.com
    #布局及输出格式
    log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
    log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

(5) 输出到数据库

    #配置输出类型
    log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
    #设置数据库URL
    log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
    #设置数据驱动
    log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
    #设置用户
    log4j.appender.DATABASE.user=root
    #设置密码
    log4j.appender.DATABASE.password=root
    #设置sql
    log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
    #布局及输出格式
    log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
    log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

(6) 每天一个日志文件(注:每天一个文件,无法设置文件数,不会清除)

#设置输出类型
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
#文件输出类型
log4j.appender.logfile.File=test.log
#文件名日期格式
log4j.appender.logfile.DataPattern='.'yyyy-MM-dd-HH-mm
#设置级别
log4j.appender.logfile.Threshold=debug
#设置编码
log4j.appender.logfile.encoding=UTF-8
#是否追加
log4j.appender.logfile.Append=false
#布局与格式
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern= [%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n

 (7) 重写FileAppender方法,实现保存天数

package com.example.demo.utils;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Layout;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;
/**
 * 扩展的一个按天滚动的appender类, 暂时不支持datePattern设置, 但是可以配置maxBackupIndex
 * @author Dan Shan
 */
public class CustomLogAppender extends FileAppender {
    /** 不允许改写的datepattern */
    private static final String datePattern = "'.'yyyy-MM-dd";
    /** 最多文件增长个数 */
    private int maxBackupIndex = 2;
    /** 文件名+上次最后更新时间 */
    private String scheduledFilename;
    /**
     * The next time we estimate a rollover should occur.
     */
    private long nextCheck = System.currentTimeMillis() - 1;
    Date now = new Date();
    SimpleDateFormat sdf;
    /**
     * The default constructor does nothing.
     */
    public CustomLogAppender() {
    }
    /**
     * 改造过的构造器
     */
    public CustomLogAppender(Layout layout, String filename, int maxBackupIndex) throws IOException {
        super(layout, filename, true);
        this.maxBackupIndex = maxBackupIndex;
        activateOptions();
    }
    /** * 初始化本Appender对象的时候调用一次 */
    @Override
    public void activateOptions() {
        super.activateOptions();
        if (fileName != null) {
            // perf.log now.setTime(System.currentTimeMillis());
            sdf = new SimpleDateFormat(datePattern);
            File file = new File(fileName);
            // 获取最后更新时间拼成的文件名
            scheduledFilename = fileName + sdf.format(new Date(file.lastModified()));
        } else {
            LogLog.error("File is not set for appender [" + name + "].");
        } if (maxBackupIndex <= 0) {
            LogLog.error("maxBackupIndex reset to default value[2],orignal value is:" + maxBackupIndex);
            maxBackupIndex = 2;
        }
    }
    /**
     * 滚动文件的函数:<br>
     * 1. 对文件名带的时间戳进行比较, 确定是否更新<br>
     * 2. if需要更新, 当前文件rename到文件名+日期, 重新开始写文件<br>
     * 3. 针对配置的maxBackupIndex,删除过期的文件
     */
    void rollOver() throws IOException {
        String datedFilename = fileName + sdf.format(now);
        // 如果上次写的日期跟当前日期相同,不需要换文件
        if (scheduledFilename.equals(datedFilename)) {
            return;
        }
        // close current file, and rename it to datedFilename 
        this.closeFile();
        File target = new File(scheduledFilename);
        if (target.exists()) {
            try {
                target.delete();
            } catch (SecurityException e) {
                e.printStackTrace();
            }
        }
        File file = new File(fileName);
        boolean result = file.renameTo(target);
        if (result) {
            LogLog.debug(fileName + " -> " + scheduledFilename);
        } else {
            LogLog.error("Failed to rename [" + fileName + "] to [" + scheduledFilename + "].");
        }
        // 删除过期文件
        if (maxBackupIndex > 0) {
            File folder = new File(file.getParent());
            List<String> maxBackupIndexDates = getMaxBackupIndexDates();
            for (File ff : folder.listFiles()) {
                // 遍历目录,将日期不在备份范围内的日志删掉
                if (ff.getName().startsWith(file.getName()) && !ff.getName().equals(file.getName())) {
                    // 获取文件名带的日期时间戳
                    String markedDate = ff.getName().substring( file.getName().length());
                    if (!maxBackupIndexDates.contains(markedDate)) {
                        result = ff.delete();
                    }
                    if (result) {
                        LogLog.debug(ff.getName() + " -> deleted ");
                    } else {
                        LogLog.error("Failed to deleted old DayRollingFileAppender file :" + ff.getName());
                    }
                }
            }    
        }
        try {
            // This will also close the file. This is OK since multiple
            // close operations are safe. 
            this.setFile(fileName, false, this.bufferedIO, this.bufferSize);
        } catch (IOException e) {
            errorHandler.error("setFile(" + fileName + ", false) call failed.");
        }
        scheduledFilename = datedFilename;
        // 更新最后更新日期戳 
    }
    /**
     * Actual writing occurs here.
     * 这个方法是写操作真正的执行过程.
     */
    @Override
    protected void subAppend(LoggingEvent event) {
        long n = System.currentTimeMillis();
        if (n >= nextCheck) {
            // 在每次写操作前判断一下是否需要滚动文件
            now.setTime(n);
            nextCheck = getNextDayCheckPoint(now);
            try {
                rollOver();
            } catch (IOException ioe) {
                LogLog.error("rollOver() failed.", ioe);
            }
        } super.subAppend(event);
    }
    /**
     * 获取下一天的时间变更点
     * @param now
     * @return
     */
    long getNextDayCheckPoint(Date now) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);// 注意MILLISECOND,毫秒也要置0.。。否则错了也找不出来的 calendar.add(Calendar.DATE, 1);
        return calendar.getTimeInMillis();
    }
    /**
     * 根据maxBackupIndex配置的备份文件个数,获取要保留log文件的日期范围集合
     * @return list<'fileName+yyyy-MM-dd'>
     */
    List<String> getMaxBackupIndexDates() {
        List<String> result = new ArrayList<String>();
        if (maxBackupIndex > 0) {
            for (int i = 1; i <= maxBackupIndex; i++) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(now);
                calendar.set(Calendar.HOUR_OF_DAY, 0);
                calendar.set(Calendar.MINUTE, 0);
                calendar.set(Calendar.SECOND, 0);
                calendar.set(Calendar.MILLISECOND, 0);
                // 注意MILLISECOND,毫秒也要置0...否则错了也找不出来的
                calendar.add(Calendar.DATE, -i);
                result.add(sdf.format(calendar.getTime()));
            }
        }
        return result;
    }
    public int getMaxBackupIndex() {
        return maxBackupIndex;
    }
    public void setMaxBackupIndex(int maxBackupIndex) {
        this.maxBackupIndex = maxBackupIndex;
    }
    public String getDatePattern() {
        return datePattern;
    }
}

   配置文件修改为

log4j.rootLogger=INFO, A1
log4j.appender.A1=pplive.auth.conf.CustomLogAppender
log4j.appender.A1.File=/auth.log
# 输出的文件目录
log4j.appender.A1.maxBackupIndex=7
# 保存的天数
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %c{1} %M %m%n

6. 示例

# 根级别
log4j.rootCategory=INFO

# 控制其他开源软件包的日志记录
log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.org.apache.commons=DEBUG

# 控制指定包下的日志记录,可使用${...} 引用配置数据
log4j.logger.com.demo= ERROR, ISSUE
log4j.appender.ISSUE=org.apache.log4j.RollingFileAppender
log4j.appender.ISSUE.File=${user.home}/log/thread_error.log
log4j.appender.ISSUE.MaxFileSize=1000KB
log4j.appender.ISSUE.MaxBackupIndex=0
log4j.appender.ISSUE.layout=org.apache.log4j.PatternLayout
log4j.appender.ISSUE.layout.ConversionPattern=[Demo] %d [%t] %-5p (%c:%L) - %m%n

# 控制指定包类的日志记录
log4j.logger.com.demo.DemoService= INFO, DemoService
log4j.appender.DemoService=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DemoService.File=${user.home}/log/PageManager.log
log4j.appender.DemoService.DatePattern = '.'yyyy-MM-dd
log4j.appender.DemoService.layout=org.apache.log4j.PatternLayout
log4j.appender.DemoService.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %-5p  %l : %m%n

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑重其事,鹏程万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值