`

与线程绑定的日志输出

    博客分类:
  • java
 
阅读更多

问题:我希望对线程内所有类的方法进行日志输出,在使用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未命名。 。 。

    CXF 文件记录报文日志,非控制台打印。

    这意味着你可以选择任意一种支持的日志框架来配置日志输出。例如,如果你选择Log4j,你需要在项目中包含Log4j的库,并配置相应的log4j.properties或log4j.xml文件来指定日志级别、输出目的地和格式。 配置文件通常...

    版本管理工具与日志工具——日志工具练习

    这些工具不仅提供简单的打印日志的功能,还能实现日志级别控制、日志格式定制、日志输出位置设置等高级特性。 Log4j是Apache的一个开源项目,它允许程序员控制日志信息的输出位置、格式以及输出级别。通过配置文件...

    linux(centos)使用glib日志库

    接下来,你需要配置日志处理函数,例如设置默认的日志处理器`g_log_set_default_handler()`,或者自定义一个处理函数来控制日志的输出格式和位置。Glib的日志处理器接受两个参数:日志记录结构体`GLogField`和用户...

    日志处理jar包

    SLF4j通过提供一套API,使得在程序中调用日志就像调用方法一样简单,然后通过绑定具体的日志实现(如log4j),就能将日志输出到指定的地方。压缩包中的"slf4j-log4j12-1.5.8.jar"就是SLF4J与Log4j的绑定包,它使得...

    Slf4j日志相关jar包

    5. **MDC(Mapped Diagnostic Context)**: Slf4j提供的一个特性,允许存储与当前线程相关的诊断信息,这对于跟踪和调试多线程应用程序非常有用。 **Log4j简介** Log4j是Apache的一个开源项目,是Java平台上的一个...

    多线程打字游戏

    如果该事件无法正常工作,可能是事件绑定代码有误,或者在多线程环境下,线程安全问题导致的。 窗体触发事件,通常是指当窗体状态改变(如加载、关闭、移动等)时触发的事件。在打字游戏中,可能有窗体激活、大小...

    大漠综合绑定测试工具Final版+.含综合工具2.1147

    可以通过查看工具的日志输出或者使用特定的API函数来检查后台进程的状态。同时,理解不同运行模式的差异,如多线程和单线程模式,将有助于优化测试效率。 当遇到“创建对象失败”的问题时,这通常是因为系统环境不...

    log4j日志管理

    - **功能**: 用于记录日志消息,通常与应用程序的某个类绑定,用于记录该类相关的日志信息。 - **使用**: 开发者可以通过`Logger`对象来记录不同级别的日志信息,如ERROR、WARN、INFO、DEBUG等。 2. **Appender**...

    java中日志文件的配置及架包

    配置主要通过log4j.properties或log4j.xml文件完成,其中包含日志输出级别、输出目的地(控制台、文件、网络等)、布局格式等内容。 2. **Logback**: 由Log4j的创始人设计,作为其升级版,Logback在性能上有所优化...

    Java异常日志捕获jar包logback

    4. **Layouts**:Layouts定义了日志输出的格式,如PatternLayout允许自定义输出格式,%d表示日期,%thread表示线程名,%msg表示日志消息等。 5. **Filters**:Filters可以对日志事件进行筛选,如基于日志级别或...

    socket csocket 套接字 网络通信 客户端服务器模式,日志

    为了实现高效和可靠的日志记录,可以采用多线程技术,让日志记录与主业务逻辑运行在不同的线程上,避免因日志输出阻塞主线程。此外,日志文件的大小和数量也需要合理管理,以免占用过多磁盘空间。 总的来说,`...

    slf4j-1.6.1-Blogback-0.9.24等日志包

    这段配置将所有日志输出到控制台,日志格式包括时间戳、线程名、日志级别、logger名称和日志消息。通过调整`&lt;root&gt;`元素的`level`属性,可以控制全局日志级别。 总结来说,"slf4j-1.6.1-Blogback-0.9.24"这个组合...

    log4j.rar java写LOG日志的驱动

    3. **MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)**:用于存储与当前线程相关的上下文信息,方便在日志中添加额外的诊断信息。 4. **Lookups(查找机制)**:允许在配置文件中使用变量,...

    mina多线程

    - 配置log4j.properties文件,设置日志输出级别、输出方式等参数。 3. **编写示例代码**: - 创建一个简单的服务端程序,例如绑定到3005端口的TCP服务器。 ```java public class Demo1Server { private static ...

    logback动态日志配置 - 示例源码

    通过理解 Logback 的动态日志配置,开发者能够更好地监控应用程序,根据需要调整日志输出。在给定的示例源码中,你可以学习到如何配置 MDC、使用 JMX 进行动态调整,以及如何在 Java 代码中实现这些功能。熟练掌握...

    教你更简单的使用log4j日志

    而`Appender`则是日志输出的目的地,Log4j提供了多种内置的Appender类型供选择: - `org.apache.log4j.ConsoleAppender`: 将日志输出到控制台。 - `org.apache.log4j.FileAppender`: 将日志输出到指定的文件中。 - ...

    Mybatis Log SQL输出

    # 配置Mybatis日志输出 logger.org.mybatis=DEBUG ``` 现在,当你运行应用时,Mybatis将会输出执行的SQL语句,包括参数绑定值。这将帮助你跟踪查询行为,检查是否按预期工作,以及找出可能的性能瓶颈。 对于复杂的...

    Logback用户手册中文版

    MDC 是一个线程绑定的存储容器,可以用来存储与日志事件相关的上下文信息。这在多线程环境下非常有用,例如添加请求ID、用户ID等,以便更好地追踪日志。 八、SiftingAppender SiftingAppender 是一种特殊的Appender...

    Log4J日记功能

    - **SLF4J(Simple Logging Facade for Java)**:提供了一层抽象,使得应用与具体日志框架解耦,可以在运行时绑定到任何支持SLF4J的日志框架。 - **Apache Commons Logging**:类似SLF4J,也是一个日志抽象层,...

Global site tag (gtag.js) - Google Analytics