Log4j2打印一行日志时返回本行日志的字符串

本文介绍了一个自定义的StringLogger类,该类利用Log4j框架实现了不同级别的日志记录功能,包括INFO、WARN、DEBUG及ERROR等,并通过PatternLayout配置了日志输出格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.message.SimpleMessage;

/**
 * Created by lanhuajian on 2017/3/29.
 */
public class StringLogger {
    private String loggerName;
    private static String FQCN = StringLogger.class.getName();
    private static final PatternLayout PATTERN_LAYOUT = PatternLayout.newBuilder()
        .withPattern("%d %t %-5p [%c]%L %m%n")
        .build();

    private StringLogger(String loggerName) {
        this.loggerName = loggerName;
    }

    public static StringLogger getLogger(Class loggerClass) {
        return new StringLogger(loggerClass.getName());
    }

    public static StringLogger getLogger(String loggerName) {
        return new StringLogger(loggerName);
    }

    public String info(String msg) {
        return PATTERN_LAYOUT.toSerializable(buildEvent(msg, Level.INFO));
    }

    public String warn(String msg) {
        return PATTERN_LAYOUT.toSerializable(buildEvent(msg, Level.WARN));
    }

    public String debug(String msg) {
        return PATTERN_LAYOUT.toSerializable(buildEvent(msg, Level.DEBUG));
    }

    public String error(String msg) {
        return PATTERN_LAYOUT.toSerializable(buildEvent(msg, Level.ERROR));
    }

    private Log4jLogEvent buildEvent(String msg, Level level) {
        return Log4jLogEvent.newBuilder()
            .setIncludeLocation(true)
            .setLoggerName(loggerName)
            .setLoggerFqcn(FQCN)
            .setLevel(level)
            .setMessage(new SimpleMessage(msg))
            .build();
    }
}

转载于:https://www.cnblogs.com/lanhj/p/6640404.html

<think>好的,我现在需要回答用户关于如何使用awk截取指定字符的问题。首先,我得回忆一下awk的基本用法,特别是处理字符串的部分。用户提到了参考内容中的几个引用,我需要结合这些信息来组织答案。 首先,用户提供的引用中提到,awk通过分隔符将行分割成字段,使用$1、$2等来引用这些字段。比如引用[1]和[2]都说明了这一点,默认分隔符是空格,但可以用-F指定其他分隔符。所以,截取字符的关键在于正确设置分隔符并选择对应的字段。 然后,用户的问题是关于截取指定字符,可能需要用到substr函数或者通过分隔符分割字段。比如引用[3]中的例子用了拼接字段,而引用[4]展示了如何用awk和cut结合处理字符串。另外,引用[5]中的sed命令虽然不直接相关,但可能涉及到文本处理的其他工具。 接下来,我需要分步骤解释如何使用awk截取字符。首先应该介绍指定分隔符的方法,比如-F选项,然后展示如何选取特定字段。比如使用-F:来以冒号分割,然后取第二个字段。另外,如果用户需要从固定位置截取,可能需要使用substr函数,比如截取第3到第5个字符。 还要注意示例的提供,比如处理/etc/passwd文件,或者自定义的输入。例如,引用[1]中的例子处理了/etc/passwd,这里可以举类似的例子。另外,引用[4]中的示例用到了管道符和多个命令,这可能需要说明如何处理更复杂的情况。 同,用户可能关心如何处理默认空格分隔和自定义分隔符的情况,需要分别举例说明。比如,使用默认空格分隔,直接使用$1、$2等,而自定义分隔符如-F:则按冒号分割。 可能还需要提到如何同使用多个分隔符,比如使用-F'[分隔符]'来指定多个分隔符,这在引用[3]的例子中出现了,比如-F '[.]',用点号作为分隔符。 最后,总结一下常用的方法,强调根据需求选择字段分割或字符串截取函数,并提供多个示例帮助用户理解。同,确保示例中的命令语法正确,并符合用户提供的引用中的方法。</think>### 逐步解析:使用`awk`截取指定字符的方法 `awk` 截取字符的核心逻辑是通过 **字段分割** 或 **字符串函数** 实现。以下是具体方法及示例: --- #### 一、通过字段分割截取 **原理**:指定分隔符将文本行切分为多个字段,用 `$1`、`$2` 等引用所需字段[^1][^2]。 1. **指定单个分隔符** 语法:`awk -F'分隔符' '{print $n}'` **示例**: ```bash # 截取/etc/passwd中每行的第一个字段(用户名) awk -F':' '{print $1}' /etc/passwd ``` 输出结果类似: ``` root bin daemon ... ``` 2. **指定多个分隔符** 语法:`awk -F'[分隔符1分隔符2]' '{print $n}'` **示例**: ```bash # 以冒号和斜杠为分隔符,截取第3个字段 echo "path:/usr/local/bin" | awk -F'[:/]' '{print $3}' ``` 输出: ``` usr ``` --- #### 二、通过字符串函数截取 **原理**:使用 `substr(str, start, length)` 函数从字符串固定位置截取[^3]。 - **语法**:`awk '{print substr($n, start_pos, length)}'` - **示例**: ```bash # 截取第2个字段的第3到第5个字符 echo "hello world 123" | awk '{print substr($2, 3, 3)}' ``` 输出: ``` rld ``` --- #### 三、综合应用场景 **场景1**:截取日志中的间戳 ```bash # 日志格式:2023-10-01T12:34:56 [ERROR] Message... awk -F'[T ]' '{print $2}' error.log # 输出12:34:56 ``` **场景2**:处理版本号并提取子版本 ```bash # 输入:"Version:2.5.8-beta" echo "Version:2.5.8-beta" | awk -F'[:-]' '{print $2,$3}' ``` 输出: ``` 2.5.8 beta ``` --- #### 四、注意事项 1. **默认分隔符为空格/TAB**,若字段包含空格需显式指定 `-F`[^2]。 2. **字段编号从1开始**,`$0` 表示整行内容。 3. **复杂截取可结合管道**,例如先 `awk` 再 `cut`(参考[^4])。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值