需要:在做日志采集时须要服务器ip,于是将服务器ip打印在日志中

这里应用了logback配置

首先,创立一个java文件,用来扩大日志字段address:

package com.jason.monitor.config;import ch.qos.logback.classic.pattern.MessageConverter;import ch.qos.logback.classic.spi.ILoggingEvent;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.StringUtils;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import java.util.Enumeration;import java.util.HashSet;import java.util.Optional;import java.util.Set;import java.util.stream.Collectors;public class AddressConverter extends MessageConverter {    private Logger logger = LoggerFactory.getLogger(this.getClass());        private static String IP_ADDRESS = "";        /**     * 每次打印日志,该办法都会被调用     * @param event     * @return     */     @Override     public String convert(ILoggingEvent event) {        if (StringUtils.isEmpty(IP_ADDRESS)) {            Set<String> ips = this.getLinuxLocalIp();            logger.debug("获取IP地址:{}", ips.stream().collect(Collectors.joining(",")));            Optional<String> result = ips.stream().findFirst();            IP_ADDRESS = result.orElse("127.0.0.1");        }        return IP_ADDRESS;    }        /**     * 获取IP地址     * @return IP地址     * @throws SocketException     */ private Set<String> getLinuxLocalIp() {        Set<String> ips = new HashSet<>();        try {            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {                NetworkInterface intf = en.nextElement();                String name = intf.getName();                if (!name.contains("docker") && !name.contains("lo")) {                    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {                        InetAddress inetAddress = enumIpAddr.nextElement();                        if (!inetAddress.isLoopbackAddress()) {                            String ipaddress = inetAddress.getHostAddress().toString();                            if (!ipaddress.contains("::") && !ipaddress.contains("0:0:") && !ipaddress.contains("fe80")) {                                ips.add(ipaddress);                            }                        }                    }                }            }        } catch (SocketException e) {            logger.info("获取IP地址失败:{}", e.getMessage());        }        return ips;    }}

而后,在logback-spring.xml中退出如下局部:

<!-- 打印IP地址 --><conversionRule conversionWord="address" converterClass="com.jason.monitor.config.AddressConverter" /><!-- 黑白日志格局 --><property name="CONSOLE_LOG_PATTERN" value="%clr(MONITOR) ${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr([%address]) %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

这里 MONITOR 是以后服务名,因为是一个固定字段,所以间接在格局中固定就行。

最初启动服务,看一下成果: