前言

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

正文

第一步:

首先是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.

Log4j(一):Log4j将日志信息写入数据库的更多相关文章

  1. Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console、file等。Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别。

    Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console.file等.Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别. ...

  2. 将不同级别的logging 日志信息写入不同文件

    将不同级别的logging 日志信息写入不同文件 # -*- coding: utf-8 -*- import os import time from logging.handlers import ...

  3. c#.NET中日志信息写入Windows日志中解决方案

    1. 目的应用系统的开发和维护离不开日志系统,选择一个功能强大的日志系统解决方案是应用系统开发过程中很重要的一部分.在.net环境下的日志系统解决方案有许多种,log4net是其中的佼佼者.在Wind ...

  4. log4j+AOP 记录错误日志信息到文件中

    AOP 采用异常通知切入,把指定包的异常记录到日志文件. 先看log4j.properties ,控制台输出的是普通信息, 文件输出的是异常信息. log4j.rootLogger=DEBUG, Co ...

  5. log4j教程 12、日志记录到数据库

    log4j API提供 org.apache.log4j.jdbc.JDBCAppender 对象,它能够将日志信息在指定的数据库. JDBCAppender 配置: Property 描述 buff ...

  6. php之将用户信息写入数据库

    session高级应用将用户信息写入到数据库中 首先建立数据库表 在实验数据库sqldb中建立session表,用于存储数据 在根文件夹下建立须要用到的文件(重点是session,class.php这 ...

  7. 解决在web项目使用log4j中无法将log信息写入文件

    这是log4j.properties中关于的配置 log4j.appender.appender2.File=F:/myeclipseworkspace2/SecondBook2/log/second ...

  8. 怎样借助log4j把日志写入数据库中

            log4j是一个优秀的开源日志记录项目.我们不仅能够对输出的日志的格式自定义,还能够自定义日志输出的目的地,比方:屏幕.文本文件,数据 库,甚至能通过socket输出.本节使用MySQ ...

  9. Log4j写入数据库详解

    log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库,甚至能通过socket输出.本节主要讲述如何将日志信息输入到 ...

随机推荐

  1. Linux系统——DNS

    DNS系统的作用1. DNS服务器Internet中,大部分网站.邮件服务等服务器都使用了域名形式的地址,这种地址形式要比使用IP地址形式更加直观,更加容易被用户记住.FQDN格式(完整域名格式):在 ...

  2. SNMP学习笔记之SNMPWALK 命令

    SNMPWALK是一个通过SNMP GET-NEXT类型PDU,实现对目标AGENT的某指定MIB分支信息进行完整提取输出的命令工作. 命令行: snmpwalk [选项] agent [oid] 选 ...

  3. PhpStorm 10.0.3破解版下载

    汉化破解版软件下载: http://pan.baidu.com/s/1geNO24r 密码: d5ci 这个汉化破解软件解决了大纲视图里空白的问题. 先安装腾讯电脑管家,然后安装这个软件,安装到最后提 ...

  4. 2018-2019-1 20189218《Linux内核原理与分析》第二周作业

    问题一 动态库链接找不到库问题 这个问题当时确实对我造成了很大的困扰,虽然最终仍然成功用动态库链接但是问题并没有解决.现在回过头来看却觉得有点蠢,但出错的过程仍然值得总结.首先看我的目录结构: 可以看 ...

  5. 20145326《Java程序设计》实验二Java面向对象程序设计实验报告

    20145326<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  6. uboot能ping通本机无法ping通本机上搭建的虚拟机

    注意 转载请注明出处:https://www.cnblogs.com/dakewei 一.背景 1.1 uboot不能被其它主机ping通,这是由于uboot没有对其它主机发送过来的arp包进行响应, ...

  7. Python学习札记(三十四) 面向对象编程 Object Oriented Program 5

    参考:获取对象信息 NOTE 1.type()函数可以用来判断对象的类型: >>> type(123) <class 'int'> >>> type(' ...

  8. Codeforces Round #413, rated, Div. 1 + Div. 2 C. Fountains(贪心 or 树状数组)

    http://codeforces.com/contest/799/problem/C 题意: 有n做花园,有人有c个硬币,d个钻石 (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100  ...

  9. HDU 1556 Color the ball(线段树:区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...

  10. POJ 1034 The dog task(二分图匹配)

    http://poj.org/problem?id=1034 题意: 猎人和狗一起出去,狗的速度是猎人的两倍,给出猎人的路径坐标,除了这些坐标外,地图上还有一些有趣的点,而我们的狗,就是要尽量去多的有 ...