zoukankan      html  css  js  c++  java
  • Log4j(一):Log4j将日志信息写入数据库

    前言

    为了监听一些数据的采集等功能,需要随时监听设备的状态,所以需要运行的时候将日志打入到数据库中。

    正文

    第一步:

    首先是jar包,由于我使用的是springboot,所以,在springboot-starter中已经包含了log4j的jar,不需要再导包,如果不是的话,需要导入log4j的包和mysql-connect的包。

    第二步:

    接下来是创建log4j的配置文件:log4j.properties配置文件,内容如下(这里只有输入到数据库中的配置,如果同时需要输入到控制台或者文件,请自行配置)

    # Define the root logger with appender file
    log4j.rootLogger = DEBUG, DB
    # Define the DB appender
    log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
    # Set JDBC URL
    log4j.appender.DB.URL=jdbc:mysql://localhost:3306/test
    # Set Database Driver
    log4j.appender.DB.driver=com.mysql.jdbc.Driver
    # Set database user name and password
    log4j.appender.DB.user=root
    log4j.appender.DB.password=root
    # Set the SQL statement to be executed.
    log4j.appender.DB.sql=INSERT INTO LOG (CREATE_TIME,TYPE,SYSTEM,HOST,TOTAL_MEMORY,FREE_MEMORY,TOTAL_DISK,FREE_DISK,CPU_CANUSE,DB_CONNECT,LOCATION,LOG_LEVEL,MESSAGE) VALUES (NOW(),'%X{TYPE}','%X{SYSTEM}','%X{HOST}','%X{TOTAL_MEMORY}','%X{FREE_MEMORY}','%X{TOTAL_DISK}','%X{FREE_DISK}','%X{CPU_CANUSE}','%X{DB_CONNECT}','%l','%p','%m')
    # Define the layout for file appender
    log4j.appender.DB.layout=org.apache.log4j.PatternLayout

    对于上面代码的解释:

    第一:写入数据库中日志的时候,可以指定sql语句。比如上面的 insert语句。另外需要指定url,username和password,这样才能正常插入。

    第二:插入的表结构可以自己设定,需要和自己的语句对应,否则会插入错误。

    第三:我的表结构如下:

    DROP TABLE IF EXISTS `log`;
    CREATE TABLE `log` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
      `TYPE` varchar(255) NOT NULL COMMENT '类型:1表示系统信息,2表示日志内容信息',
      `SYSTEM` varchar(255) DEFAULT NULL COMMENT '系统类型-位数,当type=1时候启用',
      `HOST` varchar(255) DEFAULT NULL COMMENT 'ip,当type=1时候启用',
      `TOTAL_MEMORY` varchar(255) DEFAULT NULL COMMENT '总内存量,当type=1时候启用',
      `FREE_MEMORY` varchar(255) DEFAULT NULL COMMENT '空闲内存,当type=1时候启用',
      `TOTAL_DISK` varchar(255) DEFAULT NULL COMMENT '工作盘总容量,当type=1时候启用',
      `FREE_DISK` varchar(255) DEFAULT NULL COMMENT '工作盘剩余容量,当type=1时候启用',
      `CPU_CANUSE` varchar(255) DEFAULT NULL COMMENT 'CPU可用百分比,当type=1时候启用',
      `DB_CONNECT` varchar(255) DEFAULT NULL COMMENT '连接目标数据库结果,当type=1时候启用',
      `LOCATION` varchar(255) DEFAULT NULL,
      `LOG_LEVEL` varchar(255) DEFAULT NULL,
      `MESSAGE` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

    第四:插入sql的书写,在书写的时候,必须使用'%X{TYPE}' 来表示你需要插入的时候传入值。特别注意:这里是大些的X,小写的不会识别。

    第五:最后一些符号的详情如下

    最后是代码了:

    import org.apache.log4j.Logger;
    import org.apache.log4j.MDC;
    import org.hyperic.sigar.*;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.math.BigDecimal;
    import java.net.InetAddress;
    import java.util.Properties;
    
    /**
     * @Auther: Administrator
     * @Date: 2018/8/20 09:37
     * @Description:
     */
    public class Config {
    
        private static Logger logger = Logger.getLogger(Config.class);
    
        public static void main(String[] args) throws IOException, SigarException, Exception {
            Properties props = System.getProperties();
            InetAddress addr = InetAddress.getLocalHost();
            MDC.put("TYPE","1");
            MDC.put("HOST",addr.getHostAddress());
            MDC.put("SYSTEM",props.getProperty("os.name") + "-" + props.getProperty("os.arch"));
    
            Sigar sigar = new Sigar();
            Mem mem = sigar.getMem();
            MDC.put("TOTAL_MEMORY",new BigDecimal(mem.getTotal() / 1024 /1024 / 1024d).setScale(2,BigDecimal.ROUND_HALF_UP) + "GB");
            MDC.put("FREE_MEMORY",new BigDecimal(mem.getFree() / 1024 /1024 / 1024d).setScale(2,BigDecimal.ROUND_HALF_UP) + "GB");
    
            CpuInfo[] infos= sigar.getCpuInfoList();
            CpuPerc[] cpuList = sigar.getCpuPercList();
            Double totalFree = 0.0d;
    
            for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用
                CpuPerc cpu = cpuList[i];
                totalFree += cpu.getIdle();
            }
    
            MDC.put("CPU_CANUSE",String.valueOf(totalFree/cpuList.length));
            FileSystem[] fslist = sigar.getFileSystemList();
    
            String totalDisk = null;
            String freeDisk = null;
            for (int i = 0; i < fslist.length; i++) {
                FileSystem fs = fslist[i];
                if (fs.getDevName().contains("E")) {
                    FileSystemUsage usage = sigar.getFileSystemUsage(fs.getDirName());
                    if (fs.getType() == 2) {
                        // 文件系统总大小
                        MDC.put("TOTAL_DISK",new BigDecimal(usage.getTotal() / 1024d / 1024).setScale(2,BigDecimal.ROUND_HALF_UP) + "GB");
                        MDC.put("FREE_DISK",new BigDecimal(usage.getFree() / 1024d / 1024).setScale(2,BigDecimal.ROUND_HALF_UP) + "GB");
                    }
                }
            }
            MDC.put("DB_CONNECT",true);
            try{
    
                int[] arr = {1,2,3};
                for (int i = 0; i < arr.length + 1 ; i++) {
                    System.out.println(arr[i]);
                }
            }catch (Exception e){
                logger.error("出现了异常", e);
                logger.error("出现异常:" + getExceptionMsg(e));
            }
    
        }
    
    
        private static String getExceptionMsg(Exception e){
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw, true);
            e.printStackTrace(pw);
            pw.flush();
            sw.flush();
            return sw.toString();
        }
    }

    写在最后:需要特别特别注意的是:因为我们要插入数据,很多数据都是自己事先指定的数据,所以,我们得使用MDC来把这些数据放入,然后直接打日志就可以存入数据库中了。

    还有:注意导包的时候一定要使用log4j的logger对象,否则可能无法完成日志的插入。

    关于slf4j来完成,目前我使用一直无法写入数据库,晚点更新结果。

    附录:完整版本的log4j.properties配置文件

    log4j.rootLogger = DEBUG,D,I,E,A,DB
    
    log4jFileName = dailywork
    
    log4j.appender.A = org.apache.log4j.ConsoleAppender
    log4j.appender.A.Target = System.out
    log4j.appender.A.Threshold=debug
    log4j.appender.A.layout = org.apache.log4j.PatternLayout
    log4j.appender.A.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}%6p [%F:%L] - %m%n
    
    log4j.appender.I=org.apache.log4j.RollingFileAppender
    log4j.appender.I.File=${log4jFileName}_info.log
    log4j.appender.I.Threshold=INFO
    log4j.appender.I.MaxFileSize = 20MB
    log4j.appender.I.MaxBackupIndex = 5
    log4j.appender.I.Append=true
    log4j.appender.I.layout=org.apache.log4j.PatternLayout
    log4j.appender.I.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss,SSS}%6p [%F:%L] - %m%n
    
    log4j.appender.D=org.apache.log4j.RollingFileAppender
    log4j.appender.D.File=${log4jFileName}_debug.log
    log4j.appender.D.Threshold=DEBUG
    log4j.appender.D.MaxFileSize = 20MB
    log4j.appender.D.MaxBackupIndex = 5
    log4j.appender.D.Append=true
    log4j.appender.D.layout=org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss,SSS}%6p [%F:%L] - %m%n
    
    log4j.appender.W=org.apache.log4j.RollingFileAppender
    log4j.appender.W.File=${log4jFileName}_warn.log
    log4j.appender.W.Threshold=WARN
    log4j.appender.W.MaxFileSize = 20MB
    log4j.appender.W.MaxBackupIndex = 5
    log4j.appender.W.Append=true
    log4j.appender.W.layout=org.apache.log4j.PatternLayout
    log4j.appender.W.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss,SSS}%6p [%F:%L] - %m%n
    
    log4j.appender.E=org.apache.log4j.RollingFileAppender
    log4j.appender.E.File=${log4jFileName}_error.log
    log4j.appender.E.Threshold=ERROR
    log4j.appender.E.MaxFileSize = 20MB
    log4j.appender.E.MaxBackupIndex = 5
    log4j.appender.E.Append=true
    log4j.appender.E.layout=org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss,SSS}%6p [%F:%L] - %m%n
    
    log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.DB.URL=jdbc:mysql://localhost:3306/test
    log4j.appender.DB.driver=com.mysql.jdbc.Driver
    log4j.appender.DB.user=root
    log4j.appender.DB.password=root
    log4j.appender.DB.sql=INSERT INTO LOG (CREATE_TIME,TYPE,SYSTEM,HOST,TOTAL_MEMORY,FREE_MEMORY,TOTAL_DISK,FREE_DISK,CPU_CANUSE,DB_CONNECT,LOCATION,LOG_LEVEL,MESSAGE) VALUES (NOW(),'%X{TYPE}','%X{SYSTEM}','%X{HOST}','%X{TOTAL_MEMORY}','%X{FREE_MEMORY}','%X{TOTAL_DISK}','%X{FREE_DISK}','%X{CPU_CANUSE}','%X{DB_CONNECT}','%l','%p','%m')
    log4j.appender.DB.layout=org.apache.
  • 相关阅读:
    我要好offer之 二叉树大总结
    我要好offer之 字符串相关大总结
    楼层扔鸡蛋问题[转]
    Linux System Programming 学习笔记(十一) 时间
    Linux System Programming 学习笔记(十) 信号
    Linux System Programming 学习笔记(九) 内存管理
    Linux System Programming 学习笔记(八) 文件和目录管理
    Linux System Programming 学习笔记(七) 线程
    Linux System Programming 学习笔记(六) 进程调度
    APUE 学习笔记(十一) 网络IPC:套接字
  • 原文地址:https://www.cnblogs.com/chenmc/p/9507298.html
Copyright © 2011-2022 走看看