Java:Apache log4j简明教程(二)

  在上一讲Apache log4j简明教程(一)中介绍了log4j的基本概念,配置文件,以及将日志写入文件的方法,并给出了一个详细的示例。这一讲,我在继续谈一谈如何使用log4j将日志写入MySQL数据库。

  将日志写入数据库需要经历(1)建立MySQL数据库日志记录表,(2)配置log4j配置文件,(3)编写Java执行程序三大步骤,下面将详细阐述三个步骤的具体内容。

  建立MySQL数据库日志记录表

  由于每个人想记录在MySQL数据库中的日志信息的不同,创建的表也各不相同,下面给出一个实用的示例:

USE `logs`
CREATE TABLE log4j(
    logId INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
    logDate VARCHAR(10),
    logClientIP VARCHAR(15),
    logName VARCHAR(255),
    logLevel VARCHAR(5),
    logMsg VARCHAR(255)
);

  配置log4j.properties

  由上一讲知道将日志写入MySQL时,数据源是DB,详细的实现类是JDBCAppender。JDBCAppender中与连接MySQL相关的配置参数如下表:

driver 设置连接数据库的驱动程序,如MySQL的驱动字符串为:com.mysql.jdbc.Driver;
URL 设置数据库的连接字符串;
user 设置数据库的用户名;
password 设置数据库的密码;
sql 设置操作数据库的SQL语句;

  详细的配置参见下面的示例:  

# 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://192.168.31.221/logs

# Set Database Driver
log4j.appender.DB.driver=com.mysql.jdbc.Driver

# Set database user name and password
log4j.appender.DB.user=test
log4j.appender.DB.password=test

# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO log (logDate, logClientIP, logName, logLevel, logMsg) VALUES(‘%d‘,‘%X{clientIP}‘,‘%C‘,‘%p‘,‘%m‘)

# Define the layout for file appender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

  配置文件如何配置的问题在上一讲已经讲解过了,此处不再冗述,XML格式配置文件参考如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
   <param name="url" value="jdbc:mysql://localhost/logs"/>
   <param name="driver" value="com.mysql.jdbc.Driver"/>
   <param name="user" value="test"/>
   <param name="password" value="test"/>
   <param name="sql" value="INSERT INTO log (logDate, logClientIP, logName, logLevel, logMsg) VALUES(‘%d‘,‘%X{clientIP}‘,‘%C‘,‘%p‘,‘%m‘)"/>

   <layout class="org.apache.log4j.PatternLayout">
   </layout>
</appender>

<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="DB"/>
</logger>

</log4j:configuration>

  编写Java执行程序

 1 package org.warnier.zhang.demo;
 2
 3 import java.net.InetAddress;
 4 import java.net.UnknownHostException;
 5
 6 import org.apache.log4j.Logger;
 7 import org.apache.log4j.MDC;
 8
 9 public class Test {
10
11     private static Logger logger = Logger.getLogger(Test.class);
12
13     public static void main(String[] args) throws UnknownHostException {
14         /**
15          * 获取客户端的IP;
16          */
17         InetAddress inetAddress = InetAddress.getLocalHost();
18         String clientIP = inetAddress.getHostAddress();
19         MDC.put("clientIP", clientIP);
20
21         logger.trace("TRACE > start logging...");
22         logger.debug("DEBUG > start logging...");
23         logger.info("INFO > start logging...");
24         logger.warn("WARN > start logging...");
25         logger.error("ERROR > start logging...");
26         logger.fatal("FATAL > start logging...");
27     }
28
29 }

  到此是不是就结束了?读者可能会问:“Java程序中并没有涉及到JDBC的操作,是怎么将日志写到MySQL数据的?”其实,在上一讲就谈到,log4j采用了一种机制,能够将日志直接写到数据库,换言之,对数据库的操作已经由log4j框架本身承包了。细心的读者可以看到在上一讲中将日志写进文件时也没有涉及到文件操作,原因同上。还需要提及的是,虽然这篇博客是采用MySQL数据库来讲述的,但是不要误认为log4j不兼容其他数据库,实际上只要是关系型数据库,对上述的配置文件进行相应的配置后,log4j都能够很好支持。

  下面贴上自己的处理结果:

时间: 2024-08-13 10:47:51

Java:Apache log4j简明教程(二)的相关文章

Java:Apache log4j简明教程(一)

Apache log4j的官方介绍是“log4j is a reliable, fast and flexible logging framework (APIs) written in Java, which is distributed under the Apache Software License. log4j is highly configurable through external configuration files at runtime. It views the log

docker简明教程(二)

前言这篇博文承接我的上一篇<docker简明教程一> http://9399369.blog.51cto.com/9389369/1758576 相对于上一篇来说这篇所讲到的知识会高深一点因为学习的过程不就是一步步的由简单到复杂嘛但是我的风格没变用简单的文字让朋友们学习高深的docker技术.如果觉得我写的好的话顶我上推荐希望能让跟多人看到.学习和受益. 二十二.Docker导出容器到本地文件 不管是容器不是处于运行状态都可以导出 首先查看那容器状态 [[email protected] ~]

Java 简明教程

本文为 Java 的快速简明教程,主要用于快速了解.学习和复习java的语法特点. // 单行注释 /* 多行注释 */ /** JavaDoc(Java文档)注释是这样的.可以用来描述类和类的属性. */ // 导入 java.util中的 ArrayList 类 import java.util.ArrayList; // 导入 java.security 包中的所有类 import java.security.*; // 每个 .java 文件都包含一个public类,这个类的名字必须和这

JSP 简明教程(二):JSP基本语法

基本语法 JSP只是在html的基础上嵌入一些动态的元素.下面是HelloWorld代码: <html> <% out.println("hello world"); %> </html> 以上代码中的<% %>就是动态元素.JSP中所有的特殊语法如下: <% %>:用于表示一段Java代码.这段代码在编译之后会放在_jspService()方法中. <%! %>:多了一个叹号,也用于表示一段Java代码,但是这段

[Java] Apache Ant 构建基础教程

环境:Ubuntu 12.04, java 1.7.0, ant 1.8.2. 前言 Apache Ant 是一个软件自动化构建工具,构建过程包括编译.测试和部署等.它和 Make 工具相似,但由 Java 实现,所以要求 Java 运行环境,非常适合构建 Java 程序. Ant 和 Make 明显不同之处在于 Ant 使用 XML 来表述构建过程与依赖关系,而 Make 使用 Makefile 格式文件.Ant 默认的构建文件名为 build.xml.每一个 build.xml 文件包含一个

XML简明教程——文档对象模型——DOM和SAX(二)

DOM概述: DOM是一种典型的基于XML文档树状结构的解析技术.从概念上看,DOM的解析方式非常容易理解.DOM首先加载XML文档,并把XML树状结构存放到计算机内存中做进一步处理. 1.DOM与XML基于树状结构的解析模式 1.1XML基于树状结构的解析模式 XML文档中的文档类型描述.元素.属性.处理指令.注释和文本内容都可以视为状态树的节点.虽然从XML文档本身和XPath的角度来看,节点的含义略有不同,但是,一个XML文档能够被看作是按照一定层次结构分布的节点树. 当一个XML文档被以

Java泛型简明教程

Java泛型简明教程 博客分类: Java综合 JavaApple数据结构CC++ Java泛型简明教程 本文是从 Java Generics Quick Tutorial 这篇文章翻译而来. 泛型是Java SE 5.0中引入的一项特征,自从这项语言特征出现多年来,我相信,几乎所有的Java程序员不仅听说过,而且使用过它.关于Java泛型的教程,免费的,不免费的,有很多.我遇到的最好的教材有: The Java Tutorial Java Generics and Collections ,

Java简明教程 12.多线程(multithreading)

单线程和多线程 关于它们的区别,zhihu上有一个回答,我认为十分不错,如下: 1. 单进程单线程:一个人在一个桌子上吃菜. 2. 单进程多线程:多个人在同一个桌子上一起吃菜. 3. 多进程单线程:多个人每个人在自己的桌子上吃菜. 多线程的问题是多个人同时吃一道菜的时候容易发生争抢.例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了.此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢. 例子: 多线程: 浏览器浏览一个页面,里面有很多图片,多

Java简明教程 09. 抽象类(abstract class)和接口(interface)

抽象类(abstract class) 描述抽象的事物,  比如人类(human), 就是一个抽象类. 对于人类这个抽象类, 具体的就是某一个人, 比如张三(男)啊, 小红(女)啊,虽然说人都会eat, 可是男人和女人的eat似乎又是不一样的.男人一般都是大口大口的吃, 而女人比较慢条斯理. AbstractDemo.java 1 abstract class Human { //抽象类, 特点: 1. 前面有abstract修饰 2 // 2. 无法直接生成一个对象,需要子类去继承这个类, 并