获取本机IP和使用log打印日志

本文展示了如何在Golang中获取本地IP地址,并利用内置log包进行日志打印。通过一段简洁的代码示例,帮助读者理解操作步骤。

直接上代码

package main

import (
    "bytes"
    "fmt"
    "log"
    "net"
)

var buf bytes.Buffer
var logDebug = log.New(&buf, "debug: ", log.Lshortfile+log.Ldate+log.Ltime)
var logErr = log.New(&buf, "error: ", log.Lshortfile+log.Ldate+log.Ltime)

func main() {
    logDebug.Println("获取此机器的IP地址")
   
### 配置 Log4j2 记录 IP 地址 为了使 Log4j2 能够打印IP 地址日志信息,通常需要结合应用程序的具体框架或库来获取客户端的 IP 地址,并将其作为上下文数据传递给日志系统。对于 Web 应用而言,可以通过 Servlet API 或者 Spring Security 获取请求者的 IP 地址。 #### 方法一:使用 MDC(Mapped Diagnostic Context) MDC 是一种机制,允许开发者在每次 HTTP 请求到来时向其中添加键值对,在后续的日志记录过程中可以方便地访问这些值并随同日志一起输出。具体实现如下: 1. **Web Filter 中设置 IP 地址** 如果是在基于Servlet的应用中,则可以在过滤器(Filter)里加入当前用户的IP地址至MDC: ```java import org.apache.logging.log4j.MappedDiagnosticContext; public class IpLoggingFilter implements javax.servlet.Filter { private static final String CLIENT_IP_KEY = "clientIp"; @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request; String clientIp = getClientIpAddress(httpRequest); try{ MDC.put(CLIENT_IP_KEY, clientIp); // 将 IP 放入 MDC chain.doFilter(request,response); }finally{ MDC.remove(CLIENT_IP_KEY); // 清理 MDC 数据 } } private String getClientIpAddress(HttpServletRequest request){ String ip = request.getHeader("X-FORWARDED-FOR"); if(ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)){ ip = request.getRemoteAddr(); } return ip; } } ``` 2. **更新 log4j2.xml 文件中的 Pattern Layout** 修改 `log4j2.xml` 的 `<PatternLayout>` 来显示来自 MDC 的变量 `%X{clientIp}` : ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <!-- ... --> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} [%t] Client IP:%X{clientIp} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` 这种方法适用于大多数场景,特别是当应用运行在一个标准的Java EE容器或者Spring MVC环境中时[^1]。 #### 方法二:自定义 Appender 或 Interceptor 如果上述方法不适合特定应用场景,还可以考虑创建一个自定义的 Appender 或拦截器(Interceptor),以便更精确地控制何时以及如何收集附加额外的信息到每条日志消息上。这可能涉及到编写少量代码以适应具体的业务逻辑需求[^2]。 #### 注意事项 由于 Log4j 2 设计上的变化,不再像旧版本那样公开提供直接操作配置对象的方法,因此建议尽可能利用现有的特性如 MDC 内置组件来进行定制化开发,而不是尝试动态改变核心配置结构[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值