1.API中核心的三个接口(org.apache.log4j)

This is the central class in the log4j package. Most logging operations, except configuration, are done through this class.

翻译: 这是log4j包中的中心类。除了配置之外,大多数日志记录操作都是通过这个类完成的。

Implement this interface for your own strategies for outputting log statements.

翻译:为输出日志语句的策略实现此接口。(指定日志信息应该被输出到什么地方,可以是控制台、文件)

Extend this abstract class to create your own log layout format.

翻译:扩展这个抽象类来创建自己的日志布局格式。(指定日志信息的输出格式)

这三个接口之间的关系是: 一个Logger可以有多个Appender,这意味着日志信息可以同时输出到多个设备上,

并且每个Appender都需要对应一种Layout,Layout决定输出日志信息的格式。

Logger组件的继承性

  Log4提供了一个 root Logger,他是所有Logger组件的“祖先”。以下是配置root Logger的代码

  log4j.rootLogger=INFO,console

  用户可以方便的配置存在继承关系的Logger组件。凡是在符号 . 后面的Logger组件都会成为在.前面的Logger组件的子类。列如

  log4j.apache.helloLogger

  log4j.apache.helloLogger.childrenLogger

  对于以上代码childrenLogger就是helloLogger 的子类Logger组件(和java的继承一样 子类可拥有父类的全部属性)

Log4j的基本使用方法

  • 配置Logger组件 语法

    log4j.rootLogger=[priority],appenderName,appenderName,......

    priority是日志基本 级别的顺序 DEBUG INFO  WARN ERROR .如果定义INFO级别 程序中所有DEBUG的信息都不会打印出来。 appendName 可以指定多个用逗号隔开 console,file

  • 配置appender组件 语法

    log4j.appender.apendName=value1

    log4j.appender.apendName=value1

    这里的appendName就是Logger组件所配置的appendName(console,file)  value是指appender接口的实现类org.apache.log4j.ConsoleAppender   org.apache.log4j.RollingFileAppender 等

  • 配置Layout 语法

    log4j.appender.apendName.layout=org.apache.log4j.PatternLayout (可选择Layout组件的子类)
    log4j.appender.apendName.layout.ConversionPattern=%d %t %c %p - %m%n

    其中PatternLayout 可以让开发者依照ConversionPattern去定义输出格式

      %r 自程序开始到输出当前日志所消耗的毫秒数

      %t 表示输出当前线程的名字

      %p 表示日志的级别

      %d 表示输出当前日志的日期

      %c 表示输出当前日志的Logger名字

      %m%n 当前日志的内容

在程序中使用Log4J(结合JDBC一起使用 可以在Log中打印出SQL)

1 引入相关的jar包

log4j-1.2.17.jar、slf4j-api-1.6.0.jar、slf4j-log4j12-1.7.7.jar

2.修改JDBC的Driver

Class.forName("net.sf.log4jdbc.DriverSpy")

DriverManager.getConnection("jdbc:log4jdbc:mysql://ip:3306/db1?user=root&password=******")

3.配置Log4j.properties

#####define RootLogger#####
log4j.rootLogger=INFO,console
####define a logger named helloLog####
log4j.logger.helloLog=WARN,console,file ####Appenders#####
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=D:/log.txt
#######LAYOUTS##########
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %t %c %p - %m%n log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %t %c %p - %m%n ########JDBC###########
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.sqlonly=WARN
log4j.logger.jdbc.audit=WARN
log4j.logger.jdbc.connection=WARN

4. 写一个Servlet 并在web.xml中配置此Servlet

  在init方法中(tomact启动时会运行init方法)加载Log4j的环境

package javaee.net.cn.websocket;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(this.getClass()); @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {;
Connection conn = null;
PreparedStatement stmt = null;
String content = "hello";
try {
Class.forName("net.sf.log4jdbc.DriverSpy");
conn = DriverManager.getConnection("jdbc:log4jdbc:mysql://ip:3306/db1?user=root&password=*****");
conn.setAutoCommit(false);
String sql = "insert into db1_table1 (content) values (?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1,content);
stmt.execute();
conn.commit();
conn.setAutoCommit(true);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
try {
if(conn != null)
{
conn.rollback();
conn.setAutoCommit(true);
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
try {
if(stmt != null)
stmt.close();
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} @Override
public void init() throws ServletException {
//获取配置文件的完整路径
String path = this.getServletContext().getRealPath("/");
String profile = path+this.getInitParameter("profile");
//配置Log4j环境
PropertyConfigurator.configure(profile);
} }

注意,logger被定义为static变量,是因为这个logger与当前类绑定,为了避免每次都new一个新对象,造成资源浪费。

web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Tab3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
<filter>
<filter-name>NoteFilter</filter-name>
<filter-class>javaee.net.cn.websocket.NoteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoteFilter</filter-name>
<url-pattern>/myServlet</url-pattern>
</filter-mapping> <filter>
<filter-name>HtmlFilter</filter-name>
<filter-class>javaee.net.cn.websocket.HtmlFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HtmlFilter</filter-name>
<url-pattern>/myServlet</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>javaee.net.cn.websocket.MyServlet</servlet-class>
<init-param>
<param-name>profile</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>

</web-app>

web.xml中里面有两个Filter可以参考责任链的设计模式

https://www.cnblogs.com/ssskkk/p/9226882.html

根据配置的Servlet-mapping 在浏览器输入对应的url即可看到打印效果

  控制台输出日志:2018-06-28 22:31:44,372  http-bio-8080-exec-2 jdbc.sqltiming  INFO - insert into db1_table1 (content) values ('hello')

  D:/log.txt文件中也会记录(Log4j.properties有配置文件路径)

Log4J从基础到应用的更多相关文章

  1. Mybatis的增删改和log4j的基础配置

    带条件查询 mapper文件的内容: <select id="getSelectElectron" resultType="electron"> s ...

  2. 【Log4j】分包,分等级记录日志信息

    在开发中我们经常会将不同包下的日志信息在不同的地方输出,以便于以后出问题能够直接在对应的文件中找到对应的信息! 例如:在spring+SpringMVC+mybatis的框架中,我们经常会将sprin ...

  3. Log4j日志框架学习零到壹(一)

    日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...

  4. java 日志体系(四)log4j 源码分析

    java 日志体系(四)log4j 源码分析 logback.log4j2.jul 都是在 log4j 的基础上扩展的,其实现的逻辑都差不多,下面以 log4j 为例剖析一下日志框架的基本组件. 一. ...

  5. Java程序员修炼之道 之 Logging(1/3) - Logback 配置(转)

    转自紫风乱写:http://www.blogjava.net/justfly/archive/2014/08/10/416768.html,建议大家去原处学习 写在前面的话: 作为<Java程序 ...

  6. Eclipse中创建标准web工程以及标准目录结构说明

    最近公司有个Web项目,项目结构如下: 虽然运行没有错,但是实在是别扭,标准的web应用一般不采用这种结构: 因此总结一下:     1.如何在Eclipse中创建一个标准的Web应用.     2. ...

  7. Java日志框架那些事儿

    文章首发于[博客园-陈树义],点击跳转到原文Java日志框架那些事儿. 在项目开发过程中,我们可以通过 debug 查找问题.而在线上环境我们查找问题只能通过打印日志的方式查找问题.因此对于一个项目而 ...

  8. spring boot中配置日志log和热部署

    Java的日志有很多 个人强烈不推荐log4j ,推荐log4j2和logback 在高并发,多线程的环境下log4j1 的性能和log4j2相比可以用junk来形容  对就是junk.log4j2的 ...

  9. SSH使用Slf4j

    1. Slf4j的使用 在上一篇随笔:SSH使用Log4j的基础上配置. (1)导入两个文件:slf4j-api-1.5.8.jar和slf4j-log4j12-1.5.8.jar. (2)在需要日志 ...

随机推荐

  1. Git 操作简介

    安装完成创建用户和邮箱 git config --global user.name "username"git config --global user.email "t ...

  2. ServletConfig、ServletContext 的应用

    一.ServletConfig对象及其应用(用的不多) 1. Context和ContextPath:一个web工程,若名为JavaWeb,访问的路径为:http://localhost:8080/J ...

  3. openstack系列文章(1)devstack安装测试Queens

    1.在OpenStack 圈子中,有这么一句名言:”不要让朋友在生产环境中运行DevStack.但是初学者在没有掌握OpenStack CLI的情况下用devstack安装测试环境还是不错的.本系列文 ...

  4. 3wwang的2019计划

    1.探究osg类生物----系列(35天) 已完结 [置顶]探索未知种族之osg类生物[目录]​www.3wwang.cn 2.osg中的设计模式---系列(15天) 正在创作... osg中抽象工厂 ...

  5. centos vi设置tab为4个空格 和括号自动补全

    1.打开vim配置文件 vi /etc/vimrc 2.设置tab为4个空格, 在文件末尾添加以下内容 if has( "autocmd" ) filetype plugin in ...

  6. Java 中12个原子操作类

    从JDK1.5 开始提供了 java.util.concurrent.atomic 包,该包提供了一种用法简单.性能高效.线程安全的更新一个变量的方法 原子更新基本类型类 AtomicBoolean: ...

  7. Scikit-learn 安装

    Scikit-Learn 3 pip 安装 如果安装了Python,没有安装pip,使用Windows + R,输入cmd,回车打开命令行,输入 python -m pip install -U pi ...

  8. H5新特性-canvas绘图--渐变对象路径(最复杂)--图片--变形操作

    今天的目标 3.1:canvas绘图--(重点掌握:渐变对象.路径.图片.变形) 3.2:canvas绘图--渐变对象 线性渐变: linearGradient 径向渐变: var g = ctx.c ...

  9. monkey测试样例

    我们通过在CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试了.首先,我们准备了一个有bug的项目CityWeather:通过测试这个项目(源码在附件文件夹中) ...

  10. 冒泡排序&&选择排序

    package cn.lijun.demo;//冒泡排序public class Test5 { public static void main(String[] args) { int[] arr ...