精华内容
下载资源
问答
  • Java日志记录:显示调用者的源行号(不是日志记录助手方法)
    2021-02-28 15:37:59

    替代答案。

    可以要求log4j通过使用方法来排除辅助类

    Category.log(String callerFQCN,优先级,对象消息,Throwable t)

    并将辅助类指定为“callerFQCN”。

    例如,这里是一个使用助手的类:

    public class TheClass {

    public static void main(String...strings) {

    LoggingHelper.log("Message using full log method in logging helper.");

    LoggingHelper.logNotWorking("Message using class info method");

    }}

    和助手的代码:

    public class LoggingHelper {

    private static Logger LOG = Logger.getLogger(LoggingHelper.class);

    public static void log(String message) {

    LOG.log(LoggingHelper.class.getCanonicalName(), Level.INFO, message, null);

    }

    public static void logNotWorking(String message) {

    LOG.info(message);

    } }

    第一种方法将输出您的预期结果。

    Line(TheClass.main(TheClass.java:4)) Message using full log method in logging helper.

    Line(LoggingHelper.logNotWorking(LoggingHelper.java:12)) Message using class info method

    当使用此方法时,Log4j将照常工作,避免计算堆栈跟踪(如果不需要)。

    更多相关内容
  • MYYA我们最终在Android工作中使用了这样的自定义类:import android.util.Log; public class DebugLog {public final static boolean DEBUG = true; public static void log(String message) { if (DEBUG) { String ...

    c513bcb50b20463323f6f3c42e14af4c.png

    MYYA

    我们最终在Android工作中使用了这样的自定义类:import android.util.Log;    public class DebugLog { public final static boolean DEBUG = true;     public static void log(String message) {  if (DEBUG) {    String fullClassName = Thread.currentThread().getStackTrace()[2].getClassName();    String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);    String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();    int lineNumber = Thread.currentThread().getStackTrace()[2].getLineNumber();    Log.d(className + "." + methodName + "():" + lineNumber, message);  } }}

    展开全文
  • Java日志记录:显示调用方的源行号(不是日志记录帮助程序方法)Java的众多(叹气...)日志记录框架都很好地显示了创建日志消息的方法的源文件名的行号:log.info("hey");[INFO] [Foo:413] hey但是,如果在两者之间有一...

    Java日志记录:显示调用方的源行号(不是日志记录帮助程序方法)

    Java的众多(叹气...)日志记录框架都很好地显示了创建日志消息的方法的源文件名的行号:

    log.info("hey");

    [INFO] [Foo:413] hey

    但是,如果在两者之间有一个辅助方法,则实际的调用者将是该辅助方法,并且信息量不太大。

    log_info("hey");

    [INFO] [LoggingSupport:123] hey

    确定要打印的源位置时,是否有办法告诉日志记录系统从调用堆栈中删除一帧?

    我想这是特定于实现的; 我需要的是通过Commons Logging进行的Log4J,但是我很想了解其他选项。

    8个解决方案

    34 votes

    替代答案。

    可以使用方法要求log4j排除帮助程序类

    Category.log(字符串调用方FQCN,优先级,对象消息,Throwable t)

    并将助手类指定为“ callerFQCN”。

    例如,这是一个使用帮助器的类:

    public class TheClass {

    public static void main(String...strings) {

    LoggingHelper.log("Message using full log method in logging helper.");

    LoggingHelper.logNotWorking("Message using class info method");

    }}

    以及帮助程序的代码:

    public class LoggingHelper {

    private static Logger LOG = Logger.getLogger(LoggingHelper.class);

    public static void log(String message) {

    LOG.log(LoggingHelper.class.getCanonicalName(), Level.INFO, message, null);

    }

    public static void logNotWorking(String message) {

    LOG.info(message);

    } }

    第一种方法将输出您的预期结果。

    Line(TheClass.main(TheClass.java:4)) Message using full log method in logging helper.

    Line(LoggingHelper.logNotWorking(LoggingHelper.java:12)) Message using class info method

    使用此方法时,Log4j将照常工作,避免在不需要时无需计算堆栈跟踪。

    vdr answered 2020-07-30T11:48:39Z

    5 votes

    请注意,无论您是从Log4j或以下版本中自然得到的,给出行号都是非常昂贵的。 你必须接受那笔费用...

    您可以使用以下API:

    StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace();

    StackTraceElement stackTraceElement = ...;

    stackTraceElement.getLineNumber();

    更新:

    您必须自己计算。 所以:

    要求log4j不输出它(以您的日志记录格式),

    并在消息的开头(发送给log4j的字符串)中插入行号显式。

    根据您喜欢记录器的方式,您的助手方法可以:

    在适当的时候使用显式Logger(我猜作为参数传递)(有时我们为特定上下文定义特定的logger;例如,无论它是什么类,我们都有一个logger来发送数据库请求;这使我们可以减少 当我们想要(停用)它们时,将对我们的配置文件所做的更改放在一个地方...)

    对调用类使用Logger:在这种情况下,除了传递参数外,您还可以推断出调用者类的名称...

    KLE answered 2020-07-30T11:49:36Z

    4 votes

    得出一个非常简单的解决方案,只需将FQCN(包装器类的全限定类名)添加到记录器帮助器中:

    public class MyLogger extends Logger {

    private static final String FQCN = MyLogger.class.getName() + ".";

    protected MyLogger(String name) {

    super(name);

    }

    public void info(final Object msg) {

    super.log(FQCN, Level.INFO, msg, null);

    }

    //etc...

    在您的工人阶级中,您只需要:

    public class MyClass {

    private static final Logger LOG = MyLogger.getLogger();

    private void test()

    {

    LOG.info("test");

    }

    }

    savemaxim answered 2020-07-30T11:50:00Z

    2 votes

    向KLE答案添加详细信息。 (对不起,菜鸟用户,没有比创建单独的答案更好的方法了)

    可以将行号放在MDC上下文中,而不是将行号粘贴到消息上。 参见org.apache.log4j.MDC

    例如:

    StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace();

    StackTraceElement stackTraceElement = ...;

    int l = stackTraceElement.getLineNumber();

    MDC.put("myLineNumber", l);

    这使用户可以在其log4j配置文件中使用mylineNumber

    value="Line(%X{myLineNumber})- %m%n"/>

    注意:这允许用户控制行号在消息中出现的位置和方式。 但是,由于获取stacktrace的成本非常高,因此您仍然需要找到一种关闭功能的方法。

    vdr answered 2020-07-30T11:50:38Z

    2 votes

    对于Log4j2,如Log4j2手册中“生成的Logger包装器的示例用法”中所述,完全通过使用Logger包装器来提供答案。 可以简单地(使用此处显示的org.apache.logging.log4j.core.tools.Generate $ ExtendedLogger工具生成)具有单个STUB级别的记录程序包装器,然后对其进行修改以创建模仿logIfEnabled的自定义记录方法。 (FQCN,LEVEL,Marker,消息,Throwable)-可能会忽略STUB级别并使用常规的-如果需要,请删除或注释掉STUB级别及其方法。 为此,FormattedMessage可能会有所帮助。

    通过使用配置中指定的PatternLayout中的%l位置转换模式元素,或更具体地说,使用%L行号和/或%,可以很容易地将源代码行显示为完整位置信息的一部分。 M方法转换。

    现在,在以下位置有完整的示例:Java日志记录:Log4j Version2.x:显示最终客户端调用方的方法(而不是中间日志记录帮助程序方法)

    Webel IT Australia - upvoter answered 2020-07-30T11:51:08Z

    1 votes

    开箱即用是不可能的。 在这种情况下,您可以做的最好的事情是在调用方中创建记录器,并将其传递给util方法。 这样,您至少可以了解呼叫的来源。

    Aaron Digulla answered 2020-07-30T11:51:29Z

    1 votes

    如果您拥有自己的日志记录实用程序方法,则可以将行号和文件名添加到日志记录参数列表中,并采用cpp路由。 也就是说,在编译之前,请先预处理源代码以替换_ LINE _和_ FILE _之类的标签。 作为额外的好处,这不会像在运行时确定那样占用那么多资源。

    answered 2020-07-30T11:51:49Z

    0 votes

    也许您可以使用堆栈跟踪元素来实现日志助手功能,获取行号,并使用带有某些特定注释的方法绕过框架,例如,

    public @interface SkipFrame {}

    // helper function

    @SkipFrame // not necessary on the concrete log function

    void log(String... message) {

    // getStackTrace()...

    int callerDepth = 2; // a constant number depends on implementation

    StackTraceElement callerElement = null;

    for (StackTraceElement e: stackTrace) {

    String className, methodName = e.getClassName, getMethodName()...

    Class callClass = Class.forName(className);

    // since there maybe several methods with the same name

    // here skip those overloaded methods

    Method callMethod = guessWhichMethodWithoutSignature(callClass, methodName);

    SkipFrame skipFrame = callMethod.getAnnotation(SkipFrame.class);

    if (skipFrame != null)

    continue; // skip this stack trace element

    if (callerDepth-- == 0) {

    callerElement = e;

    break;

    }

    }

    assert callerDepth == 0;

    assert callerElement != null;

    Log4j.info(callerElement.getLineNumber()... + "message... ");

    }

    @SkipFrame

    void logSendMail(Mail mailObject) {

    log("Send mail " + mailObject.getSubject());

    }

    因此,如果嵌套了辅助函数,或者使用了更多辅助函数,只需在所有这些辅助函数上标记SkipFrame批注,您将获得您真正想要的正确源代码行号。

    Xiè Jìléi answered 2020-07-30T11:52:14Z

    展开全文
  • 1、java日志记录错误的文件、方法、行号、报错信息StackTraceElement s= e.getStackTrace()[0];1.1、记录保存的文件s.getFileName()1.2、记录保存的方法s.getMethodName()1.3、记录报错的行号 s.getLineNumber()1.4...

    1、java日志记录错误的文件、方法、行号、报错信息

    StackTraceElement s= e.getStackTrace()[0];

    1.1、记录保存的文件s.getFileName()

    1.2、记录保存的方法s.getMethodName()

    1.3、记录报错的行号 s.getLineNumber()

    1.4、记录报错的信息(不全面) e.getMessage()

    1.5、互利报错的类名字 e.getClassName()

    1.6、打印详细的堆栈信息 logger.error("错误堆栈", e);

    获取堆栈信息,如果直接打印e,则会将它toString

    /**

    * 获取堆栈信息

    * @param throwable

    * @return

    */

    public static String getStackTrace(Throwable throwable){

    StringWriter sw = new StringWriter();

    PrintWriter pw = new PrintWriter(sw);

    try

    {

    throwable.printStackTrace(pw);

    return sw.toString();

    } finally

    {

    pw.close();

    }

    }

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    /**

    * @Desc: 异常打印日志 ,提供给打印非正常异常

    * @Author HealerJean

    * @Date 2018/8/21 下午6:41.

    */

    public static void log(Throwable e,Class c){

    Logger logger = LoggerFactory.getLogger(c);

    // logger.error("错误堆栈", e);

    StackTraceElement s= e.getStackTrace()[0];//数组长度为 1

    logger.error("\n\n-----------------"+

    "\n报错文件名:"+s.getFileName()+

    "\n报错的类:"+s.getClassName()+

    "\n报错方法::"+s.getMethodName()+

    "\n报错的行:"+ s.getLineNumber()+

    "\n报错的message:"+ e.getMessage()+

    "\n错误堆栈:\n"+getStackTrace(e)+

    "\n------------------\n\n");

    }

    1.2 、使用

    public static void main(String[] args) {

    try {

    int i =1/0 ;

    }catch (Exception e){

    log(e,ExceptionLogUtils.class );

    }

    }

    11:40:53.732 [main] ERROR com.duodian.youhui.admin.utils.ExceptionLogUtils -

    -----------------

    报错文件名:ExceptionLogUtils.java

    报错的类:com.duodian.youhui.admin.utils.ExceptionLogUtils

    报错方法::main

    报错的行:68

    报错的message:/ by zero

    错误堆栈:

    java.lang.ArithmeticException: / by zero

    at com.duodian.youhui.admin.utils.ExceptionLogUtils.main(ExceptionLogUtils.java:68)

    ------------------

    2、打印变量日志

    log.info("cacheMsg RECUR_FIGHT A: roomId = {}, userId = {}, toUid = {}", room.getRoomId(), ctx.getUserId(), toUid);

    3、info打印更多的信息

    3.1、打印方法

    public static void logInfo(String msg,Class c){

    Logger logger = LoggerFactory.getLogger(c);

    String location="";

    StackTraceElement[] stacks = Thread.currentThread().getStackTrace();

    System.out.println(stacks.length); //长度为3

    for(StackTraceElement stackTraceElement:stacks){

    logger.info("\n\n**************"+

    "\n打印文件名:"+stackTraceElement.getFileName() +

    "\n打印类名:"+ stackTraceElement.getClassName() +

    "\n方法名:" + stackTraceElement.getMethodName() +

    "\n行号:" + stackTraceElement.getLineNumber() +

    "\n打印内容:"+msg+

    "\n**************\n\n");

    System.out.println(location);

    }

    }

    3.2、测试

    1、是当前线程,2、当前打印所在方法,3、是调用该方法的类,那么我们需要的就是第三个

    public static void main(String[] args) {

    logInfo("HealerJean",ExceptionLogUtils.class);

    }

    3

    11:44:47.685 [main] INFO com.duodian.youhui.admin.utils.ExceptionLogUtils -

    **************

    打印文件名:Thread.java

    打印类名:java.lang.Thread

    方法名:getStackTrace

    行号:1559

    打印内容:HealerJean

    **************

    11:44:47.689 [main] INFO com.duodian.youhui.admin.utils.ExceptionLogUtils -

    **************

    打印文件名:ExceptionLogUtils.java

    打印类名:com.duodian.youhui.admin.utils.ExceptionLogUtils

    方法名:logInfo

    行号:31

    打印内容:HealerJean

    **************

    11:44:47.689 [main] INFO com.duodian.youhui.admin.utils.ExceptionLogUtils -

    **************

    打印文件名:ExceptionLogUtils.java

    打印类名:com.duodian.youhui.admin.utils.ExceptionLogUtils

    方法名:main

    行号:49

    打印内容:HealerJean

    **************

    1和3总结

    package com.duodian.youhui.admin.utils;

    import lombok.extern.slf4j.Slf4j;

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    import java.io.PrintWriter;

    import java.io.StringWriter;

    /**

    * @Desc: 异常打印日志 ,提供给打印非正常异常

    * @Author HealerJean

    * @Date 2018/8/21 下午6:41.

    */

    @Slf4j

    public class ExceptionLogUtils {

    public static void log(Throwable e,Class c){

    Logger logger = LoggerFactory.getLogger(c);

    // logger.error("错误堆栈", e);

    StackTraceElement s= e.getStackTrace()[0];//数组长度为 1

    logger.error("\n\n-----------------"+

    "\n报错文件名:"+s.getFileName()+

    "\n报错的类:"+s.getClassName()+

    "\n报错方法::"+s.getMethodName()+

    "\n报错的行:"+ s.getLineNumber()+

    "\n报错的message:"+ e.getMessage()+

    "\n错误堆栈:\n"+getStackTrace(e)+

    "\n------------------\n\n");

    }

    /**

    * 获取堆栈信息

    * @param throwable

    * @return

    */

    public static String getStackTrace(Throwable throwable){

    StringWriter sw = new StringWriter();

    PrintWriter pw = new PrintWriter(sw);

    try

    {

    throwable.printStackTrace(pw);

    return sw.toString();

    } finally

    {

    pw.close();

    }

    }

    public static void logInfo(String msg,Class c){

    Logger logger = LoggerFactory.getLogger(c);

    StackTraceElement[] stacks = Thread.currentThread().getStackTrace();//数组长度为 3

    logger.info("\n\n**************"+

    "\n打印文件名:"+stacks[2].getFileName() +

    "\n打印类名:"+ stacks[2].getClassName() +

    "\n方法名:" + stacks[2].getMethodName() +

    "\n行号:" + stacks[2].getLineNumber() +

    "\n打印内容:"+msg+

    "\n**************\n\n");

    }

    }

    4、打印变量

    log.info("admin[{}],[{}],[{}];请求地址:[{}];访问ip:[{}]", CasConfig.RemoteUserUtil.getRemoteUserId(),CasConfig.RemoteUserUtil.getRemoteUserAccount(),CasConfig.RemoteUserUtil.getRemoteUserName(),request.getRequestURL(), IpUtil.getIp());

    如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,添加博主微信哦, 请下方留言吧。可与博主自由讨论哦

    支付包

    微信

    微信公众号

    展开全文
  • 先介绍下java系统的日志日志框架:是一种日志接口,不负责具体的日志输出形式(有点类似于JDBC),可以灵活的切换日志输出形式。常见的日志框架有slf4j、jcl,只提供Logger、LoggerFactory等接口日志系统:是应用实际...
  • java:输出带行号信息的简易日志

    千次阅读 2018-03-27 21:33:28
    log4j输出日志是很方便的,但有的时候,不希望依赖太多第三方库,但希望用类似log4j的方式方便在控制台输出程序运行的基本信息,用System.out.printf输出又无法显示代码位置,而且printf还要注意匹配输出参数的类型...
  • Java日志打印方法

    千次阅读 2021-02-12 09:29:48
    一、使用log4j打印日志1. 下载log4j.jar和commons-logging.jar。2.将准备好的两个jar包放到项目的lib包中(添加到项目的build path中)。方法:右键单击项目→选择“属性”→JavaBuild Path→Add External JARs。3.在...
  • 哦,了解了,这个行号是混淆后处理了的行号,这个44行号可以在a.l.smali文件可以找到crash的位置。如:crash发生在XCrash.java的51行:Caused by: java.lang.NullPointerException: Attempt to invoke virtual method...
  • java日志

    2021-02-27 17:53:10
    4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 1.HTMLLayout 选项 LocationInfo=true:默认值是false,输出java文件名称和行号 Title=my app file: 默认值是 Log4J Log Messages. 2....
  • 它保存的是 { 行数:8,方法名:f ,类名:Test ,文件名:Test.java },而不是说在 第8行进入了ffffffff()方法, 记录的是 在第8行的f()方法进入了某个方法 编写日志类 可以调整数组(栈)的下标,来决定返回那一个位置 ...
  • 我有一个来自客户的错误,当我查看日志时,我们跟踪异常,某些堆栈跟踪没有行号:at xxxx.xxx.xx.x.xx.DayIntervalRule.getInterval(DayIntervalRule.java)at xxxx.xxx.xx.x.xx.XXSchedule.getNextDueDate...
  • //获取行号  public static int getLineNumber(Exception e){  StackTraceElement[] trace =e.getStackTrace();  if(trace==null||trace.length==0) return -1; //  return trace[0].getLineNumber();  
  • C语言中有__FILE__、__LINE__等预定义宏,用于获取当前文件名和行号等信息,而且它们的值在预处理时就已经确定了,不会占用运行时时间去计算,这对打印日志相当有用。那么,Java语言是否也有类似的功能呢?Java是否...
  • 作者elvishew,源码xLog,简单、美观、强大、可扩展的 Android 和 Java 日志库,可同时在多个通道打印日志,如 Logcat、Console 和文件。如果你愿意,甚至可以打印到远程服务器(或其他任何地方)。 XLog 能干什么:...
  • java8 源码 作用 日志工具,支持更多信息的打印 支持打印行号、方法、内部类名,支持在Logcat中的点击行号跳转代码 支持空参,单一参数,多参数打印 支持log日志信息写入本地文件,以时间为节点,避免日志内容过长,...
  • 4种Java日志管理方法

    2021-02-12 09:53:46
    java开发中常见的几种日志管理方案有以下4种:1. Commons-logging + log4j2. log4j3. slf4j + log4j + commmons-logging4. slf4j + log4j详细说明如下。1、log4j概述log4j是Apache的一个开源项目,主要是用来做Java...
  • 写好程序的日志可以帮助我们大大减轻后期维护压力。在实际的工作中,开发人员往往迫于巨大时间压力,而写日志又是一个非常繁琐的事情,往往没有引起足够的重视。开发人员应在一开始就养成良好的日志撰写习惯,并且应...
  • 系统使用的是slf4j+logback日志组合,而且为了系统的个性化需求,封装了自己的日志操作类Log.java,不是直接使用slf4j的API: private static Logger logger = LoggerFactory.getLogger(xxx.class); 配置信息 ...
  • Java日志体系日志实现 JUL、logback、log4j、log4j2JUL日志级别 java.util.logging.Level示例讲解功能JULTest 测试类 test方法 不同日志输出方法testLogConsoleConfig方法 控制台输出测试testLogFileConfig方法 输出...
  • Exceptioninthread"AWT-EventQueue-0"java.lang.ClassCastExceptionatjavax.swing.LayoutComparator.compare(UnknownSource)atjavax.swing.LayoutComparator.compare(UnknownSource)a...Exception in thread "AWT-Ev...
  • 项目上线后,每次遇到系统来回调用的问题,QA,BA往往需要询问开发,而开发先查代码,日志记录关键词,进而到kibana中进行检索,同时由于日志记录量大,还需要各种操作筛选等。最终可能问题的解决只花费了10分钟,...
  • Java日志框架的使用

    2022-05-02 12:44:00
    1 日志文件   日志文件是用于记录系统操作事件的集合,可分为事件日志...2 Java常用日志框架   JUL(java.util.logging)、JCL(Apache Commons Logging)、Logback、Log4j、Log4j2、Slf4j、Jboss-logging 等。 2.1
  • 使用Java实现日志框架,关键的技术在于前面提及的日志框架特性的内部实现,特别是:日志的分类和级别、日志分发框架的设计、日志记录器的设计以及在设计中的高性能和高稳定性的考虑。2.1系统架构日志系统框架可以...
  • 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。 在计算机中,日志文件是记录在操作系统或其他软件运行中发生的事件或在...
  • JAVA 打印日志

    2020-12-10 16:35:20
    Java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中写日志了。 log4j , 最强大的记录日志的方式。 可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。 commons-...
  • Java日志--logback--配置/介绍/基础

    千次阅读 2021-09-24 00:31:26
    万字详解logback日志框架,再没这么全的了!_程序新视界-CSDN博客 logback基本使用_Python_dengjili的专栏-CSDN博客logback的使用和logback.xml详解 - 行走在云端的愚公 - 博客园 logback 常用配置详解(二) - ...
  • 一文搞懂Java日志级别,重复记录、丢日志问题

    万次阅读 多人点赞 2020-12-06 21:33:46
    13 | 日志日志记录真没你想象的那么简单 2020-04-07 朱晔 你好,我是朱晔。今天,我和你分享的是,记录日志可能会踩的坑。 一些同学可能要说了,记录日志还不简单,无非是几个常用的API方法,比如debug、info、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,231
精华内容 8,492
关键字:

java 日志 行号

java 订阅