小弟近在研究日志处理,写下体会,供大家作一下参考:
先来看一段代码:
package com.syp.log;
import java.util.Enumeration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Test {
static Log log = LogFactory.getLog(Test.class);
/**
* @param args
*/
public static void main(String[] args) {
log.info("这里在info里的");
System.out.println(log.getClass().getName());
}
}
它的输出结果如下
org.apache.commons.logging.impl.Jdk14Logger
2008-11-4 21:15:04 com.syp.log.Test main
信息: 这里在info里的
为什么这里的log对象是org.apache.commons.logging.impl.Jdk14Logger的实例呢?
原因在于Log只是通用日志包下的一个接口而已
在通用日志包中已有Jdk14Logger,Log4jLogger,LogKitLog,NoOpLogger,SimpleLog实现了Log接口
LogFactory是一个抽象类,public class LogFactoryImpl extends LogFactory
这个实现类,在LogFactory中的getLog(Class)这个方法,只能过多个判断来获得LogFactory的
而有这样一段代码:
public static final String FACTORY_DEFAULT =
"org.apache.commons.logging.impl.LogFactoryImpl";
if (factory == null) {
factory = newFactory(FACTORY_DEFAULT,
LogFactory.class.getClassLoader());
}
if (factory != null) {
cacheFactory(contextClassLoader, factory);
if( props!=null ) {
Enumeration names = props.propertyNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
String value = props.getProperty(name);
factory.setAttribute(name, value);
}
}
}
return factory;
当获得了logFactoryImpl实例后可以用 public Log getInstance(String
name)这个方法得到Log实例,而我们上面得到的Log为
org.apache.commons.logging.impl.Jdk14Logger,就是在这一步得到的,下面我们看看它是怎么得到的:
protected String getLogClassName() {
Return the previously identified class name (if any)
if (logClassName != null) {
return logClassName;
}
logClassName = (String) getAttribute(LOG_PROPERTY);
if (logClassName == null) { // @deprecated
logClassName = (String) getAttribute(LOG_PROPERTY_OLD);
}
if (logClassName == null) {
try {
logClassName = System.getProperty(LOG_PROPERTY);
} catch (SecurityException e) {
;
}
}
if (logClassName == null) { // @deprecated
try {
logClassName = System.getProperty(LOG_PROPERTY_OLD);
} catch (SecurityException e) {
;
}
}
当在一定的范围内找不到logClassName,就会通过下以方法来获得logClassName,
第一个是获得apache的log4j的LogClassName,但因为工程中没有log4j的jar包,classpath里没有org.apache.commons.logging.impl.Log4JLogger
无法加载该Log,所以logClassName==null
而后,就会得到Jdk14Logger的logclassname,所以在上面输出的是org.apache.commons.logging.impl.Jdk14Logger
但是当我们把log4j的jar包加到工作的classpath下,得到的输出结果就会不一样了,会是这样的
log4j:WARN No appenders could be found for logger (com.syp.log.Test).
org.apache.commons.logging.impl.Log4JLogger
log4j:WARN Please initialize the log4j system properly.
首先输出log4jLogger很容易理解理,因为环境中有log4j,但会输入其实两个警靠的语句,是因为我们没有对log4j初始化,固才有警告语句
if ((logClassName == null) && isLog4JAvailable()) {
logClassName = "org.apache.commons.logging.impl.Log4JLogger";
}
if ((logClassName == null) && isJdk14Available()) {
logClassName = "org.apache.commons.logging.impl.Jdk14Logger";
}
if ((logClassName == null) && isJdk13LumberjackAvailable()) {
logClassName =
"org.apache.commons.logging.impl.Jdk13LumberjackLogger";
}
if (logClassName == null) {
logClassName = "org.apache.commons.logging.impl.SimpleLog";
}
return (logClassName);
}
通过上面我的例子我们可能得出:只要我们实现了通用日志包中log接口和logfactory,我们就可以用自己日志记录来处理。
上文中有很多地方说的不是很明白,有不懂之处可互相交流,小弟也是才接触这东西,望见谅
下面是上例的源码:第一次运行时请将log4j.jar去掉,才能看到如上述说明的一样。
分享到:
相关推荐
Apache通用日志包.pdf 常用的日志实现方法 Apache 通用日志包的配置方法 配置Log4J
不推荐使用 go-apachelog。 请参阅 github.com/cespare/hutil/apachelog 去 apachelog 这是一个以 Apache 通用日志格式编写服务器日志的小型库。 有关使用说明,请参阅。 代码主要基于logging.go。
Apache针对不同的语言平台为做了一系列日志工具包,可应用于java、.net、php、c++,这些日志包都是免费的,使用非常方便,可以极大提高...现在,Apache通用日志工具commons-logging和Log4j已经成为Java日志的标准工具。
R包,用于处理Apache Web服务器访问日志文件 提供处理Apache HTTPD日志文件的功能。 主要功能是将访问和错误日志文件中的数据提取到数据帧中。 可用功能: 以通用或组合格式将Apache HTTPD访问日志读取到数据...
Apache 的特性: 1) 几乎可以运行在所有的计算机平台上. 2) 支持最新的HTTP/1.1协议 3) 简单而且强有力的基于文件的配置(HTTPD.CONF). 4) 支持通用网关接口(CGI) 5) 支持虚拟主机. 6) 支持HTTP认证. 7) 集成...
作为一个 Web 站点,必须考虑它的安全性,本书详细介绍如何对 Apache 实现安全机制,例如使用基本认证、服务器状态和日志、安全 Socket 层等等。为了让读者能够更好地了解 Apache 的工作情况,我们还特别介绍了 ...
支持通用和组合日志格式。 在 GNU v3 下获得许可。 特征: 自动内容长度计算 调用 response.end 时激活 不需要中间件,例如 express 或 connect 默认为 Apache2 日志格式默认值 不需要调用 writeHead 以符合 CLF...
3.支持通用网关接口 4.支持基于IP和基于域名的虚拟主机 5.支持多种方式的HTTP认证 6.集成Perl处理模块 7.集成代理服务器模块 8.支持实时监视服务器状态和定制服务器日志 9.支持服务器端包含指令(SSI) 10.支持安全...
Dynatrace通用日志提取Log4j2 Appender Log4j2 Appender将Java应用程序与Dynatrace通用日志提取功能集成在一起。 为了使其正常工作,您必须提供两个参数: activeGateUrl启用了通用日志提取模块的ActiveGate实例的...
所有常用的日志格式,例如:NCSA通用日志格式,扩展日志格式,W3C扩展日志文件,Nginx JSON,OVH 一些流行的云服务的日志文件:Amazon AWS CloudFront日志,AWS S3日志,AWS ELB日志。 流媒体服务器日志文件,例如...
它支持三种最常见的日志格式(“通用日志格式”,“带有虚拟主机字段的通用日志格式”和“组合日志格式”),还允许您通过向其传递用于生成日志文件的LogFormat字符串来指定自定义日志格式。要解析。预定义的日志...
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件。 功能介绍: 1.支持最新的HTTP/1.1通信协议 2.拥有简单而...
该perl脚本(apache_log_sql.pl)用于将Apache通用日志格式的日志文件移动到Oracle数据库中。
去年一年,我写了将近100篇网络日志。...下面就是我的日志分析脚本,虽然它还不是通用的,但是我相信里面用到的命令,足以满足一般的日志分析需求,同时也是很好的学习Bash的实例。如果下面的每一个命令你都
数据文件:Apache通用日志格式(CLF) CLF中生成的日志文件条目将如下所示: 127.0.0.1 - - [01/Aug/1995:00:00:01 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1839 详细信息-> 为什么选择星火 服务器...
Spark+AI Summit 2019 会议上开源的项目,详见【重磅 | Apache Spark 社区期待的 Delta Lake 开源了】,当时文章只是简单介绍了下功能,本文将深入介绍 Apache Spark Delta Lake 的事务日志,通过本文我们可以了解 ...
浮木一些日志安装$ cargo add driftwood用法此板条箱当前提供三个记录器:Apache通用日志格式 let mut app = tide :: new ();app. with (driftwood :: ApacheCommonLogger); 范例: 127.0.0.1 - frank [10/Oct/2000:...
使用在现有的通用日志格式(CLF)日志文件(例如Apache或Nginx日志文件)中找到的相同请求轰炸Web服务器。 请求以相同的顺序,相同的时间交付。 可以将其视为网站的整体模拟。 理想情况下,他们不能说出区别。 安装...
日志管理:对用户的操作进行记录。 聊天室:系统所有用户可在一起进行畅聊,不受任何人监听,安全可靠。 系统消息:可发送系统消息给指定的用户;也可以广播消息,用户实时收到消息并弹出框提示。 数据库:可查看...