首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不丢失调用者方法名称的情况下包装Logger的日志方法?

在不丢失调用者方法名称的情况下包装Logger的日志方法,可以使用Java的反射机制来实现。下面是一个示例代码:

代码语言:txt
复制
import java.lang.reflect.Method;
import java.util.logging.Logger;

public class LogWrapper {
    private static final Logger logger = Logger.getLogger(LogWrapper.class.getName());

    public static void log(String message) {
        // 获取调用者的方法名
        String callerMethodName = getCallerMethodName();
        
        // 打印日志
        logger.info(callerMethodName + ": " + message);
    }

    private static String getCallerMethodName() {
        // 获取调用者的堆栈信息
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        
        // 遍历堆栈信息,找到调用者的方法名
        for (StackTraceElement element : stackTrace) {
            if (!element.getClassName().equals(LogWrapper.class.getName())) {
                return element.getMethodName();
            }
        }
        
        return "";
    }
}

使用该LogWrapper类,可以在不丢失调用者方法名称的情况下包装Logger的日志方法。示例用法如下:

代码语言:txt
复制
public class MyClass {
    public void myMethod() {
        LogWrapper.log("This is a log message.");
    }
}

这样,在调用myMethod()方法时,日志输出的内容将包含调用者方法的名称,例如:

代码语言:txt
复制
myMethod: This is a log message.

这种方式可以帮助开发人员更好地追踪日志信息,方便定位问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java开发手册-异常日志

二方包在类冲突时,仲裁机制可能导致引入非预期版本使类方法签名匹配,或者在字节码修改框架(比如:ASM)动态创建或修改类时,修改了相应方法签名。...这是一个非核心功能点影响到核心应用典型反例。 10.【推荐】方法返回值可以为 null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回 null 值。...说明:本规约明确防止 NPE 是调用者责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败,运行时异常等场景返回 null 情况。 11....如果加了栈信息,在频繁调用出错情况下,数据序列化和传输性能损耗也是问题。 (三) 日志规约 1....【强制】应用中扩展日志打点、临时监控、访问日志等)命名方式: appName_logType_logName.log。

56910

论一个优秀工程师应该如何做好异常处理和日志记录

在用户注册场景中,如果用户输入非法字符,或者用户名称已存在,或者用户密码过于简单,在程序上作出分门别类判断,并提示给用户 捕获异常是为了处理,不要捕获了什么都不处理.如果不需要处理,应该将异常抛给调用者...,不会再执行try块中return语句 捕获异常与抛出异常必须完全匹配,或者是抛异常父类 方法返回值可以为null,不强制返回空集合或者空对象等,必须添加注释充分说明什么情况下会返回null值...即使调用方法返回空集合或者空对象,对于调用者来说,必须考虑到远程调用失败,序列化失败,运行时异常等返回null场景 一定要防止出现NPE异常,注意NPE产生场景: 返回类型为基本数据类型,return...为频次发生特点 应用中扩展日志(打点,临时监控,访问日志等)命名方式: 对 级别的日志输出,必须使用条件输出形式或者使用占位符方式 避免重复打印日志,浪费磁盘空间,必须在中设置 <logger...logger.error(各类参数或者对象toString() + "_" + e.getMessage(), e); 谨慎记录日志: 生产环境禁止输出debug日志 有选择地输出info日志 如果使用

49320
  • log4j学习笔记–ConversionPattern参数详解– RollingFileAppender选项

    大家好,又见面了,我是你们朋友全栈君 1、rootLogger与rootCategory区别 rootLogger是新使用名称,对应Logger类 rootCategory是旧使用名称...,对应原来Category类 Logger类是Category类子类,所以,rootCategory是旧用法,推荐使用 2、格式参数 a)例句 : log4j.appender.stdout.layout.ConversionPattern...%C(c大写) 输出日志所属类目的调用者全类名。...b)不常用几个: %F 输出日志消息产生时所在文件名称。性能不好,建议使用 %M 输出日志消息产生时所在方法名称。...: %20c:指定输出category名称,最小宽度是20,如果category名称小于20的话,默认情况下右对齐。

    1.2K20

    拥抱.NET Core系列:Logging (1)

    可以看到 Logging 核心抽象就是三个接口,分别是: ILogger:负责具体日志写入逻辑,:FileLogger,ConsoleLogger,SQLLogger,ElasticsearchLogger...这些消息可能包含敏感应用程序数据。默认情况下禁用这些消息,并且不应在生产环境中启用这些消息。 Debug 在开发过程中用于交互式调查日志。这些日志应主要包含对调试有用信息,不具有长期价值。...回到目录 CreateLogger 方法 CreateLogger 方法签名为 ? 它提供了两个扩展方法,可以通过类型作为分类名称,如下: ? 如何根据类型确定分类名称?...在扩展方法内部使用了“GetTypeDisplayName(Type type)”来根据类型获取名称(里面有一些逻辑处理,但一般是采用“{命名空间}.{类型名称}”作为分类名称)。 ?...需要记录对象,这边可以传入任何类型,这就有点奇怪了日志都是字符吗? 如果我传一个自建类 UserModel 进去会记录出什么信息呢?请接下来看 formatter 参数。

    66011

    Go语言实战笔记(十八)| Go log 日志

    我们大部分情况下,都有很多业务,每个业务都需要记录日志,那么有没有办法,能区分这些业务呢?这样我们在查找日志时候,就方便多了。...了解了结构体Logger字段,现在就可以看下它最重要方法Output了,这个方法会输出格式化好日志信息。...1的话就是再向上一层,表示调用者调用者。 log日志包里使用是2,也就是表示我们在源代码中调用log.Print、log.Fatal和log.Panic这些函数调用者。...io.MultiWriter实现也很简单,定义一个类型实现io.Writer,然后在实现Write方法里循环调用要包装多个Writer接口Write方法即可。...使用比较麻烦,针对这种情况,可以使用第三方log框架,也可以自定包装定义,直接通过不同级别的方法来记录不同级别的日志,还可以设置记录日志级别等。

    1.1K21

    Log4j 2.0在开发中高级使用详解—SocketAppender远程输出(五)

    Log4j2Appenders充分考虑了日志事件输出、包装以及过滤转发可能,包括最基本输出到本地文件、输出到远程主机, 对文件进行封装、注入,并且还能按照日志文件时间点...⑺ name,String ,Appender名称。 ⑻ protocol,String,通讯协议 默认TCP。...⑿ immediateFlush,boolean, 当该值设置成真时,默认情况下,每个写将冲洗。 这将保证写数据 到磁盘,但可能会影响性能。...⒂ ignoreExceptions,boolean,默认值是真正添加事件时,遇到了引起异常 内部记录,然后忽略。 当设置为假将传播到异常 调用者。...日志服务器代码(main方法): package com.herman.log4j2.server; import java.io.IOException; import java.net.ServerSocket

    1.8K10

    Python日志记录:一个深入教程

    记录器名称是唯一,这意味着如果创建了名称为“toto”记录器,随后调用logging.getLogger("toto")将返回相同对象: assert id(logging.getLogger...这个记录器在使用类似方法时被调用logging.debug()。默认情况下,根日志级别为WARN,因此每个具有较低级别的日志(例如通过logging.info("info"))都将被忽略。...如果您想从您使用库中捕获错误消息,请确保将根记录器配置为写入文件,例如,以使调试更容易。默认情况下,根记录器只输出到stderr,所以日志很容易丢失。...要使用日志记录,请确保使用创建新日志记录器logging.getLogger(logger name)。我通常 __name__用作记录器名称,但只要一致,任何东西都可以使用。...还有一些IDE特定调试器,pydev引擎或PTVS。 关于作者 Son 对软件工程和ML算法非常熟练,并且总是尽力用简单而高效方法解决问题,从而使代码长期可维护。

    2.1K30

    【愚公系列】2021年12月 二十三种设计模式(一)-工厂方法模式(Factory Method Pattern)

    ---- 提示:以下是本篇文章正文内容,下面案例可供参考 一、工厂方法模式(Factory Method Pattern) 工厂方法模式属于创建型模式,定义一个创建对象接口,让其子类自己决定实例化哪一个工厂类...二、使用步骤 角色 1、抽象工厂(Creator) 是工厂方法模式核心角色,任何在模式中创建对象工厂类必须实现这个接口; 2、具体工厂(Concrete Creator) 这是实现抽象工厂接口具体工厂类...另外包含一个LoggerFactory工厂基类,它又包含4个对应工厂实现类。本案例尝试以一个日志记录器来讲述工厂方法模式运作机制。...(string.Format(LOG_MESSAGE, _logger.LoggerType())); } } 以上是调用方代码,首先需要维持日志和工厂基类,然后创建不同日志记录器并记录日志内容...---- 总结 优点 1、一个调用者想创建一个对象,只要知道其名称就可以了; 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以; 3、屏蔽产品生成具体实现,调用者只关心产品接口。

    15330

    微服务日志实践指南

    至少,日志需要包含以下详细信息: 服务名称 用户ID 主机名 关联ID(可以是traceid形式) 请求ID 时间戳 总持续时间(在请求结束时) 方法名称 调用堆栈(日志行号) 请求方法 请求URI...我们对 Go 应用程序进行了工具化,以生成按照此文档描述方式跟踪。 我们将进一步检查如何在日志中添加上下文信息。我们使用 zap 库进行日志记录。...为了在日志中添加跟踪上下文信息, traceID、spanID 和 traceFlags,我们实现了一个记录 zap 日志消息日志包装器,将其记录为现有跟踪上事件。...必须将跟踪上下文作为第一个参数传递给日志包装器。如果上下文包含跟踪上下文,则不会向日志添加任何内容。 步骤1:我们进行 zap 日志记录器初始设置。...为了比较,让我们看看集成包装器之前和之后日志

    43110

    阅读Logback文档笔记--LogbackAppender配置

    默认情况下,每一个log event都会被立即刷新到输出流。这种默认做法对数据而言是比较安全,可以避免因为应用程序异常退出,而导致缓冲区日志丢失风险。...设置成之后,当前有效日志文件名称永远都是file属性指定值,当发生日志滚动时,再根据fileNamePattern值更改存档日志名称,然后创建一个新有效日志文件,名为file属性指定值。...为了防止避免日志丢失,经常可靠办法就是调用SocketAppenderclose方法,或者调用LoggerContextstop方法,在退出应用之前。...caller_filename varchar 日志事件调用者文件名 caller_class varchar 日志事件调用者类名 caller_method varchar 日志事件调用者函数...只有一些获取代价较低数据,线程名称,MDC值才会被保留。

    2.2K10

    论如何优雅自定义ThreadPoolExecutor线程池

    线程池相关参数配置 说到这一点,我们只需要谨记一点,一定不要选择没有上限限制配置项。 这也是为什么建议使用Executors 中创建线程方法。...JDK自带拒绝策略如下: AbortPolicy:直接抛出异常阻止系统正常工作。 CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃任务。...我们可以通过它来实现比如初始化ThreadLocal、收集统计信息、记录日志等操作。这类HookbeforeExecute和afterExecute。...另外还有一个Hook可以用来在任务被执行完时候让用户插入逻辑,rerminated 。 如果hook方法执行失败,则内部工作线程执行将会失败或被中断。...我们可以使用beforeExecute和afterExecute来记录线程之前前和后一些运行情况,也可以直接把运行完成后状态记录到ELK等日志系统。

    1.3K10

    《Mybatis 手撸专栏》第8章:把反射用到出神入化

    反射调用者 3. 反射器解耦对象 4. 元类包装反射器 5. 对象包装器Wrapper 6. 元对象封装 7. 数据源属性设置 五、测试 1. 事先准备 2....而这些处理过程实际都是在使用 JDK 所提供反射进行操作,而反射过程中方法名称、入参类型都已经被我们拆解和处理了,最终使用时候直接调用即可。 四、实现 1....,这样在对 get/set 方法反射调用时候,使用方法名称获取对应 Invoker 即可 getGetInvoker(String propertyName)。...反射调用者 关于对象类中属性值获取和设置可以分为 Field 字段 get/set 还有普通 Method 调用,为了减少使用方过多处理,这里可以把集中调用者实现包装成调用策略,统一接口不同策略不同实现类...框架源码都喜欢使用设计模式,从来不是一行行ifelse代码 在对象包装器接口中定义了更加明确需要使用方法,包括定义出了 get/set 标准通用方法、获取get\set属性名称和属性类型,以及添加属性等操作

    68530

    Zap高性能日志库实践

    Zap 广泛应用于各种 Go 项目中,尤其是那些对性能、日志结构化和可观测性有较高要求场景,微服务、分布式系统等。...这里是我查到zap默认配置信息: Debug 级别日志:包含调用者信息,但不包含堆栈信息。 Info 级别日志:包含调用者信息,但不包含堆栈信息。...Warn 级别日志:包含调用者信息,但不包含堆栈信息。 Error 级别日志:包含调用者信息,并包含堆栈信息。 DPanic 级别日志:包含调用者信息,并包含堆栈信息。...与 zap 原生结构化日志记录器相比,Sugared Logger 提供了类似于 fmt.Printf 风格方法,这使得记录日志更为简便,但在性能上略有损失。.../ 使用 Sugar 方法创建一个新 Logger 实例 sugar.Infow("调用失败", // 使用 Sugar 方法记录日志 "方法"

    18810

    Go每日一库之87:zap

    logger 缓冲。...Logger logger 提供快速,分级,结构化日志记录。所有的方法都是安全,内存分配很重要,因此它 API 有意偏向于性能和类型安全。...Logger和SugaredLogger成为具体类型并不会牺牲太多抽象,而且它允许我们在不引入破坏性更改情况下添加方法。您应用程序应该定义并依赖只包含您使用方法接口。...为什么我一些日志丢失? 在启用抽样时,通过zap有意地删除日志。生产配置(NewProductionConfig()返回那样)支持抽样,这将导致在一秒钟内对重复日志进行抽样。...由于写入通常是序列化,因此在最需要时,logger会限制吞吐量。 采样通过删除重复日志条目来解决这个问题。在正常情况下,您应用程序会输出每个记录。

    59740

    高性能 Go 日志库 zap 设计与实现

    转载请声明出处哦~,本篇文章发布于luozhiyun博客:https://www.luozhiyun.com/archives/542 最近我也在学习如何在开发中让代码运行更加高效,然后在浏览各种优秀日志设计时候看到...,这样可以更快格式化代码; EncoderConfig:上面所说 Encoder 还可以根据 EncoderConfig 配置允许使用者灵活配置日志输出格式,从日志消息键名、日志等级名称,到时间格式输出定义...,这个灵活配置不只是日志输出 key 名称,而是通过在 EncoderConfig 中传入函数来调用到用户自定义 Encoder 实现。...在我们初始化完成 Logger 后,就可以使用它来调用相应 Info、Warn、Error 等方法打印日志输出。由于所有的日志级别的输出方法是一样,所以这里通过 Info 方法来进行分析。...方法获取,需要主要是传入 ce 是个 nil 指针,但是这样也方案 Go 调用其 AddCore 方法(要是放在 java 上该报错了)。

    4K21

    Java 异常处理下篇:11 个异常处理最佳实践

    Exception,以便提供更明确异常信息,让调用者更容易处理异常情况。...public void readFile(String filename) throws IOException { // 读取文件代码}正确包装自定义异常中异常在自定义异常中包装其他异常时,...确保将原始异常作为参数传递给自定义异常构造函数,以便堆栈跟踪包含所有相关信息,避免信息丢失。...一个尝试读取文件方法,如果抛出 NullPointerException,那么它不会给调用者任何相关信息。相反,如果这种异常被包裹在自定义异常中则会更好。...NoSuchFileFoundException 则对该方法调用者更有用。异常处理后清理资源在异常处理中,确保清理已分配资源,以避免资源泄漏。可以通过在 finally 块中进行清理操作来实现。

    51740

    分布式系统中如何优雅地追踪日志(原理篇)

    分布式系统中日志追踪需要考虑几个点? 需要一个全服务唯一id,即traceId,如何保证? traceId如何在服务间传递? traceId如何在服务内部传递?...我们一一来解答: 全服务唯一traceId,可以使用uuid生成,正常来说不会出现重复; 关于服务间传递,对于调用者,在协议头加上traceId,对于被调用者,通过前置拦截器或者过滤器统一拦截; 关于服务内部传递...,在提交时候包装任务,这个工作量比较大,因为服务内部可能依赖其它框架,这些框架线程池有可能也需要修改; 实现 我们模拟A到B这两个服务来实现一个日志跟踪系统。...为了简单起见,我们使用SpringBoot,它默认使用日志框架是logback,而且Slf4j提供了一个包装了InheritableThreadLocal类叫MDC,我们只要把traceId放在MDC...,包装提交任务。

    2.5K30
    领券