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.
  • 相关阅读:
    职业规划书
    阿里云mysql安装配置(CentOS 7.3 64)
    在mvc中弹出提示框
    俺的博客开通啦
    sql中计算列小解
    ext的grid 获取页面内容方式
    2条路 代码生成 or 配置 2.1
    ext做列表页面关于查询多行的办法
    .net下开发windows服务的经验
    微软.net下 charting 要注意的事情
  • 原文地址:https://www.cnblogs.com/chenmc/p/9507298.html
Copyright © 2011-2022 走看看