在要输出的类xxxAction的开头写下:
private ABC logger = ABC.getInstance(xxxAction.class);
在要输出信息类的方法中写入:
StackTraceElement stack[] = (new Throwable()).getStackTrace();
logger.info("Now in xxxx"+" And this method called by: "+stack[1].toString());
或者
StackTraceElement stack[] = (new Throwable()).getStackTrace();
for(int i=1;i<=stack.length;i++){ String inStackValue = stack[i].toString(); logger.info("++++++++++++++++"+inStackValue+"+++++++++++++"); } 就可以知道相关详细信息。 实际自定义的输出LOG的类: public class ABC{ private ABC() { super(); } private String strClassName = null; private static int I_LEVEL_NONE = -1; private static int I_LEVEL_FATAL = 0; private static int I_LEVEL_ERROR = 1; private static int I_LEVEL_WARN = 2; private static int I_LEVEL_INFO = 3; private static int I_LEVEL_DEBUG = 4; private static int I_LEVEL_TRACE = 5; private static int I_LEVEL_DEFAULT = I_LEVEL_INFO; private static final String STR_LEVEL_NAME[] = { "FATAL", "ERROR", "WARN ", "INFO ", "DEBUG", "TRACE" }; private void setStrClassName(String strClassName) { this.strClassName = strClassName; } private String getStrClassName() { return strClassName; } public static ABC getInstance(Class cls) { ABC abc = new ABC (); if (cls == null) { abc .setStrClassName(null); } else { abc .setStrClassName(cls.getName()); } return abc ; } public void fatal(String strLog) { print0(I_LEVEL_FATAL, strLog); } public void error(String strLog) { print0(I_LEVEL_ERROR, strLog); } public void warn(String strLog) { print0(I_LEVEL_WARN, strLog); } public void info(String strLog) { print0(I_LEVEL_INFO, strLog); } public void debug(String strLog) { print0(I_LEVEL_DEBUG, strLog); } public void trace(String strLog) { print0(I_LEVEL_TRACE, strLog); } private void print0(int iLevel, String strLog) { print0(iLevel, getStrClassName(), strLog); } private static void print0(int iLevel, String strClassName, String strLog) { PrintWriter pw = null; try { if (strClassName == null) { return; } final String STR_FILE_NAME = getLogFileName(); pw = new PrintWriter(new FileWriter(STR_FILE_NAME, true)); print0(pw, iLevel, strClassName, strLog); } catch (IOException ioe) { } finally { if (pw != null) pw.close(); } } /** * 日付・時間と情報をログへ出力する。 * @param pw ログの出力先 * @param iLevel ログレベル * @param strClassName クラス名 * @param strLog ログへ出力する情報 */ private static void print0(PrintWriter pw, int iLevel, String strClassName, String strLog) { StringBuffer sb = new StringBuffer(); // ログレベルのチェック if (checkLogLevel(iLevel) == false) { return; } // 現在時刻の追加 final Date D_CURRENT = Calendar.getInstance().getTime(); sb.append(new SimpleDateFormat("[yyyy.MM.dd HH:mm:ss:SSS zzz] ").format(D_CURRENT)); // レベルの追加 sb.append(STR_LEVEL_NAME[iLevel] + " "); // クラス名の追加(null の時は追加しない) if (strClassName != null) { sb.append("[" + strClassName + "] "); } // 情報の追加 sb.append(strLog); pw.println(sb); pw.flush(); } } 或者直接使用 考虑到性能问题,不打算引入额外的log4j.jar包。在struts的lib中有一个commons-logging-1.0.4.jar包,现在我来说一下它的运行机制。
在Struts中对日志功能的使用遵循以下的步骤:
1.
如果你自己导入了log4j.jar包并在WEB-INF/classes目录下添加log4j.properties,即可启用log4j。(注意:不需要加入commons-logging.properties文件;还有如果项目中有spring加入spring会自动加入log4j.jar包)
2.
如果存在JDK1.4, 使用JDK1.4
3.
如果两者都不存在,就使用SimpleLog。
现在我重点来说我们这个BSPF项目中用到的比较高性能的SimpleLog类的具体配置。
其实很简单,只要在你的WEB-INF/classes目录中加入两个properties配置文件就OK了。
###这个是commons-logging.properties文件
###指定你要用的日志类
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog###这个是simplelog.properties文件
###首先指定你的输出级别:必须为"trace", "debug", "info", "warn", "error", or "fatal"
###从trace到fatal级别越来越高,低级包括高级别的日志输出,默认为info
org.apache.commons.logging.simplelog.defaultlog=fatal
###输出的日志消息中是否包含当前日志器实例的简写名字,默认true
org.apache.commons.logging.simplelog.showShortLogname
###输出的日志消息中是否应包含当前时间信息,默认false
org.apache.commons.logging.simplelog.showdatetime
###最后注意一点SimpleLog类把日志输出到System.err中,无需你自己配置
###虽然现在不能到文件中,但以后可以改源码或换成log4j还是比较方便,不用改程序的源码最后再给大家一个example
package org.chinacreator.test;
//必须引入的两个类
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log; public class LoggingTest {
//SimpleLog会为每个类单独输出一个日志
private static Log log = LogFactory.getLog(LoggingTest.class);
public static void main(String[] args) {
/**
*
大家注意,我没有直接去执行log.trace之类的操作,而是先作了一个判断,这是有道理的。
*
其实无非就是一个性能的问题
*
大家想想,如果我在simplelog.properties文件中org.apache.commons.logging.simplelog.defaultlog=fatal,也就是
*
指定了最高级别,那就没有fatal错误以下的日志输出到System.err了,那我还在调用log.trace方法不是一种多余
*
特别是在里面还有一个String
msg
=
"你想出现的信息",然后再log.trace(msg)这不是对内存开销更大。
*
*/
if (log.isTraceEnabled()) {
log.trace("Test logging trace level");
}
if (log.isDebugEnabled()) {
log.debug("Test logging debug level");
}
if (log.isInfoEnabled()) {
log.info("Test logging info level");
}
if (log.isWarnEnabled()) {
log.warn("Test logging warn level");
}
if (log.isErrorEnabled()) {
log.error("Test logging error level");
}
if (log.isFatalEnabled()) {
log.fatal("Test logging fatal level");
}
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2095938
分享到:
相关推荐
dotnet log 输出 demodotnet log 输出 demodotnet log 输出 demodotnet log 输出 demodotnet log 输出 demodotnet log 输出 demo
本文将深入探讨“Log工具,控制log输出”这一主题,以及如何利用Log Util进行有效管理。 首先,我们要理解什么是Log等级。Log等级是一种控制日志输出的机制,它允许开发者根据需要过滤不同级别的日志信息。常见的...
为了将`System.out.println()`的输出转到Log4j,我们可以创建一个特殊的Appender,它监听标准输出流(System.out)。Log4j提供了一个名为`org.apache.log4j.ConsoleAppender`的类,用于将日志输出到控制台,我们可以...
本教程聚焦于蓝牙LOG输出,这是调试和优化蓝牙系统性能的关键环节。"青风蓝牙5.0教程"是专为理解蓝牙5.0版本的特性与操作而设计的,特别是针对log输出这一主题,它将帮助开发者更好地理解设备间的交互过程。 蓝牙...
`spdlog`的可扩展性体现在可以自定义输出目标(sink)。例如,你可以创建一个将日志发送到网络服务器或数据库的自定义sink。 ### 7. 性能优化 `spdlog`注重性能,其设计避免了不必要的字符串复制和内存分配。在...
Unity 实现Debug实时输出到屏幕或控制台上,并将Log信息记录在日志文件中
本文将深入讲解如何配置log4j以实现日志输出到控制台和文件,并提供相关代码实例和案例分析。** ### 一、Log4j简介 Log4j是Apache组织开发的一个开源项目,用于生成日志信息。它提供了灵活的配置方式,支持多种输出...
Linux 中 Java log 输出中文乱码解决方案 Linux 中 Java log 输出中文乱码问题是 Java 应用程序在 Linux 环境下一个常见的问题。该问题的产生是由于 Linux 系统的 locale 设置不正确导致的。locale 是 Linux 系统中...
android自定义log日志输出工具,该工具类具有以下优点: 1 在LogUtlis方法的第一个参数中填this可以输出当前类的名称,特别是在匿名内部类使用也可以输出当前类名。 如 : LogUtils.i(this,”这是一个实用的日志...
"很好用的LOG封装"是一个专门针对日志记录功能的自定义实现,旨在提供更高效、更便捷的日志输出方式,同时具备控制日志是否输出的能力。下面我们将详细讨论这个LOG封装的一些关键知识点。 首先,"MyLog.java"是这个...
Log4Cpp是一个流行的C++日志库,它模仿了Java的Log4j框架,提供了灵活的日志输出功能。本篇文章将深入探讨如何利用Log4Cpp有效地将日志输出到文件,实现最佳实践。 首先,理解Log4Cpp的基本结构至关重要。Log4Cpp...
Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...
`log4net`允许将日志输出到不同的目的地,如控制台、文件、电子邮件、数据库等。每种目标都有相应的appender,如`ConsoleAppender`、`FileAppender`、`SmtpAppender`等。布局(layout)则决定了日志的格式,如`...
设置log4j的根目录,值为 日志等级(DEBUG,INFO,WARN,ERROR,FATAL) , 输出目标名称 log4j.rootLogger=DEBUG,A1 设置输出方式,常用的有: ConsoleAppender 在控制器中输出信息 RollingFileApperder 在文件中输出...
传统的调试方式如UART(通用异步收发传输器)通过串口输出log信息,但这种方式需要额外的硬件支持,并且在没有物理串口或者串口资源紧张的情况下会受到限制。为了解决这个问题,J-Link提供了一种名为Real-Time ...
swift砖块系列:Swift Log输出工具,可分级别打印log,方便排查日志,添加unicode转码,持续输出中文,支持swift4以上,支持log到本地文件中,添加淘汰算法默认七天淘汰一次log日志文件.zip
这篇博文主要探讨的是如何配置Log4j以改变日志输出的位置。 首先,我们要理解Log4j的核心配置文件——`log4j.properties`。这个文件使用键值对的形式定义了日志的行为和输出设置。在`log4j.properties`中,有以下几...
Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的功能和灵活的配置,使得我们可以根据需要动态地改变日志的输出路径。本文将深入探讨如何在Log4j中实现日志输出路径的动态配置。 首先,我们要理解Log4j...
log4j错误打印到控制台 并且输出sql语句
本话题将深入探讨如何使用Log4j实现多文件输出打印,以及自定义日志的配置。 首先,我们要理解Log4j的基本工作原理。Log4j的核心组件包括Logger、Appender和Layout。Logger负责生成日志事件,Appender则负责接收...