问题:我希望对线程内所有类的方法进行日志输出,在使用AOP编程时 发现我要输出日志的很多类都是静态方法,因此,自己写了一个类对日志进行处理。
package com.iss.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.ResourceBundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 保存日志类
*
* @author gjp
*
*/
public class MessageHandleLogUtil {
final Logger logger = LoggerFactory.getLogger(getClass());
// 日期输出格式
private static final int TIMESTAMP = 1;
private static final int TIMESTAMP_DATE = 2;
private static final int DATE = 3;
private static final int TIME24 = 4;
private static MessageHandleLogUtil logInfo = null;
private static ThreadLocal<MessageHandleLogUtil> local = new ThreadLocal<MessageHandleLogUtil>();
private StringBuffer sb = new StringBuffer();
// false:不在控制台打印日志,true:在控制台打印日志
private static boolean flag = false;
// 日志是否在控制台输出标签
private static final String LOG_OUT_FLAG = "LOG_OUT_FLAG";
// 文件后准名称
private static final String FILE_SUFFIX = ".log";
// 日志输出路径标签
private static final String LOG_FILE_DIR = "LOG_FILE_DIR";
// 日志输出路径
private static String FilePath = null;
static {
ResourceBundle rb = ResourceBundle.getBundle("config");
FilePath = rb.getString(LOG_FILE_DIR);
flag = Boolean.parseBoolean(rb.getString(LOG_OUT_FLAG).trim());
}
public static MessageHandleLogUtil getInstance() {
logInfo = local.get();
if (logInfo == null) {
logInfo = new MessageHandleLogUtil();
local.set(logInfo);
}
return logInfo;
}
public void writeLog(String str) {
sb.append(dateInfo(TIMESTAMP));
sb.append("-");
sb.append(str);
sb.append("\n");
// 输出日志
if (flag) {
outConsole(str);
}
}
/**
* 向平台输入日志
*
* @param str
*/
public void outConsole(String str) {
StringBuffer sbf = new StringBuffer();
sbf.append(dateInfo(TIMESTAMP));
sbf.append("-");
sbf.append(str);
System.out.println(sbf.toString());
}
/**
* 保存报文过程
*
* @param fileLogName
*/
public void saveLogPress(String fileLogName) {
saveLog(fileLogName, null);
}
/**
* 保存报文体
*
* @param fileLogName
* @param content
*/
public void saveLogContent(String fileLogName, String content) {
saveLog(fileLogName, content);
}
/**
* 文件名称
*
* @param fileLogName
* @return
*/
public String filePath() {
StringBuffer sbFileName = new StringBuffer();
sbFileName.append(FilePath);
sbFileName.append(File.separator);
sbFileName.append(dateInfo(DATE));
sbFileName.append(File.separator);
return sbFileName.toString();
}
/**
* 保存实现方法
*
* @param fileLogName
* @param content
*/
private void saveLog(String fileLogName, String content) {
// 文件名
String fileName = dateInfo(TIMESTAMP_DATE) + "_" + fileLogName
+ FILE_SUFFIX;
File filePath = new File(filePath());
if (!filePath.exists()) {
filePath.mkdirs();
}
File file = new File(filePath, fileName);
OutputStream os = null;
try {
if (!file.exists()) {
file.createNewFile();
}
os = new BufferedOutputStream(new FileOutputStream(file));
if (null != content) {
os.write(content.getBytes());
} else {
os.write(sb.toString().getBytes());
}
os.flush();
} catch (Exception e) {
logger.error("error", e.getCause());
e.printStackTrace();
} finally {
if (null != os) {
try {
os.close();
// 清空sb字符串
if (null != sb) {
sb = new StringBuffer();
}
} catch (IOException e) {
logger.error("IOException", e.getCause());
e.printStackTrace();
}
}
}
}
/**
* 返回当前时间
*
* @return
*/
public String dateInfo(int type) {
String dateTime = null;
SimpleDateFormat sdf = null;
switch (type) {
case TIMESTAMP:
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:ms");
break;
case TIMESTAMP_DATE:
sdf = new SimpleDateFormat("yyyyMMddHHmmssms");
break;
case DATE:
sdf = new SimpleDateFormat("yyyyMMdd");
break;
case TIME24:
sdf = new SimpleDateFormat("HHmmssms");
break;
default:
break;
}
dateTime = sdf.format(Calendar.getInstance().getTime());
return dateTime;
}
}
相关推荐
简单实用的日志框,使用高级表格...内部有加许可处理,可以在多线程下调用。不过支持超过多少条清空,清空后速度就恢复了。支持自动滚屏,焦点时自动停止滚屏,支持清屏时,自动保存日志到目录下。@By未命名。 。 。
这意味着你可以选择任意一种支持的日志框架来配置日志输出。例如,如果你选择Log4j,你需要在项目中包含Log4j的库,并配置相应的log4j.properties或log4j.xml文件来指定日志级别、输出目的地和格式。 配置文件通常...
这些工具不仅提供简单的打印日志的功能,还能实现日志级别控制、日志格式定制、日志输出位置设置等高级特性。 Log4j是Apache的一个开源项目,它允许程序员控制日志信息的输出位置、格式以及输出级别。通过配置文件...
接下来,你需要配置日志处理函数,例如设置默认的日志处理器`g_log_set_default_handler()`,或者自定义一个处理函数来控制日志的输出格式和位置。Glib的日志处理器接受两个参数:日志记录结构体`GLogField`和用户...
SLF4j通过提供一套API,使得在程序中调用日志就像调用方法一样简单,然后通过绑定具体的日志实现(如log4j),就能将日志输出到指定的地方。压缩包中的"slf4j-log4j12-1.5.8.jar"就是SLF4J与Log4j的绑定包,它使得...
5. **MDC(Mapped Diagnostic Context)**: Slf4j提供的一个特性,允许存储与当前线程相关的诊断信息,这对于跟踪和调试多线程应用程序非常有用。 **Log4j简介** Log4j是Apache的一个开源项目,是Java平台上的一个...
如果该事件无法正常工作,可能是事件绑定代码有误,或者在多线程环境下,线程安全问题导致的。 窗体触发事件,通常是指当窗体状态改变(如加载、关闭、移动等)时触发的事件。在打字游戏中,可能有窗体激活、大小...
可以通过查看工具的日志输出或者使用特定的API函数来检查后台进程的状态。同时,理解不同运行模式的差异,如多线程和单线程模式,将有助于优化测试效率。 当遇到“创建对象失败”的问题时,这通常是因为系统环境不...
- **功能**: 用于记录日志消息,通常与应用程序的某个类绑定,用于记录该类相关的日志信息。 - **使用**: 开发者可以通过`Logger`对象来记录不同级别的日志信息,如ERROR、WARN、INFO、DEBUG等。 2. **Appender**...
配置主要通过log4j.properties或log4j.xml文件完成,其中包含日志输出级别、输出目的地(控制台、文件、网络等)、布局格式等内容。 2. **Logback**: 由Log4j的创始人设计,作为其升级版,Logback在性能上有所优化...
4. **Layouts**:Layouts定义了日志输出的格式,如PatternLayout允许自定义输出格式,%d表示日期,%thread表示线程名,%msg表示日志消息等。 5. **Filters**:Filters可以对日志事件进行筛选,如基于日志级别或...
为了实现高效和可靠的日志记录,可以采用多线程技术,让日志记录与主业务逻辑运行在不同的线程上,避免因日志输出阻塞主线程。此外,日志文件的大小和数量也需要合理管理,以免占用过多磁盘空间。 总的来说,`...
这段配置将所有日志输出到控制台,日志格式包括时间戳、线程名、日志级别、logger名称和日志消息。通过调整`<root>`元素的`level`属性,可以控制全局日志级别。 总结来说,"slf4j-1.6.1-Blogback-0.9.24"这个组合...
3. **MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)**:用于存储与当前线程相关的上下文信息,方便在日志中添加额外的诊断信息。 4. **Lookups(查找机制)**:允许在配置文件中使用变量,...
- 配置log4j.properties文件,设置日志输出级别、输出方式等参数。 3. **编写示例代码**: - 创建一个简单的服务端程序,例如绑定到3005端口的TCP服务器。 ```java public class Demo1Server { private static ...
通过理解 Logback 的动态日志配置,开发者能够更好地监控应用程序,根据需要调整日志输出。在给定的示例源码中,你可以学习到如何配置 MDC、使用 JMX 进行动态调整,以及如何在 Java 代码中实现这些功能。熟练掌握...
而`Appender`则是日志输出的目的地,Log4j提供了多种内置的Appender类型供选择: - `org.apache.log4j.ConsoleAppender`: 将日志输出到控制台。 - `org.apache.log4j.FileAppender`: 将日志输出到指定的文件中。 - ...
# 配置Mybatis日志输出 logger.org.mybatis=DEBUG ``` 现在,当你运行应用时,Mybatis将会输出执行的SQL语句,包括参数绑定值。这将帮助你跟踪查询行为,检查是否按预期工作,以及找出可能的性能瓶颈。 对于复杂的...
MDC 是一个线程绑定的存储容器,可以用来存储与日志事件相关的上下文信息。这在多线程环境下非常有用,例如添加请求ID、用户ID等,以便更好地追踪日志。 八、SiftingAppender SiftingAppender 是一种特殊的Appender...
- **SLF4J(Simple Logging Facade for Java)**:提供了一层抽象,使得应用与具体日志框架解耦,可以在运行时绑定到任何支持SLF4J的日志框架。 - **Apache Commons Logging**:类似SLF4J,也是一个日志抽象层,...