java修改.xml文件以及.properties文件的属性值

java修改.xml文件以及.properties文件的属性值

这里提供一个修改logback.xml和tomcat的日志保留天数的示例;

项目需求:在使用logback日志配置,以及部署到tomcat服务器的java web项目,,在页面设置生成的落地日志保留的天数,,原始值logback是60天,tomcat貌似也是60天或者90天吧!!
直接上代码吧!这里修改.xml文件的属性的时候,不需要考虑顺序问题,但是修改properties文件属性时候,需要考虑一下顺序问题,正常的Properties工具修改的话,没有顺序的,因为底层Hashtable无序,,所以我这里重写了一下Properties的底层实现,LinkedHashSet,,可以设置一下顺序,,,但是效率不高了,如果是文件内容多的,建议不用管顺序了

package com.sinorail.web.controller.system.action;

import com.sinorail.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.w3c.dom.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;

import java.util.Properties;

/**
 * @Author wangchang
 * @Description 设置日志的保留天数,项目中更改logback.xml的maxHistory
 * tomcat中修改logging.properties和server.xml的maxDays
 * @Date 2023/9/19 16:13
 */
@Component
public class ResetMaxHistoryAction {

    @Value("${filepath.tomcatLogging}")
    private String tomcatLogging;

    @Value("${filepath.tomcatServer}")
    private String tomcatServer;

    /**
     * 重新设置logback.xml的maxHistory的天数
     *
     * @param maxHistory
     */
    public void resetMaxHistory(String maxHistory) {
        try {
            // 创建DOM解析器工厂
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 创建DOM解析器
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 获取资源文件
            File file = ResourceUtils.getFile("classpath:logback.xml");
            // 读取XML文件
            Document doc = builder.parse(file);
            // 获取根元素
            Element root = doc.getDocumentElement();
            // 获取要改变的元素
            NodeList nodeList = root.getElementsByTagName("maxHistory");
            for (int i = 0; i < nodeList.getLength(); i++) {
                Element element = (Element) nodeList.item(i);
                Text text = (Text) element.getFirstChild();
                // 改变属性值
                text.setData(maxHistory);
            }
            // 将更改后的XML文件保存到磁盘
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            transformer.transform(new DOMSource(doc), new StreamResult(file));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * tomcat中修改logging.properties的maxDays
     *
     * @param maxDays
     */
    public void resetLoggingMaxDays(String maxDays) {
        Properties prop = new OrderedProperties();
        try {
            // 加载.properties文件
            prop.load(new FileInputStream(tomcatLogging));

            // 修改属性值
            prop.setProperty("1catalina.org.apache.juli.AsyncFileHandler.maxDays", maxDays);
            prop.setProperty("2localhost.org.apache.juli.AsyncFileHandler.maxDays", maxDays);
            prop.setProperty("3manager.org.apache.juli.AsyncFileHandler.maxDays", maxDays);
            prop.setProperty("4host-manager.org.apache.juli.AsyncFileHandler.maxDays", maxDays);

            // 保存修改后的.properties文件
            FileOutputStream outputStream = new FileOutputStream(tomcatLogging);
            prop.store(outputStream, "Update MaxDays");
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * tomcat的server.xml中的Valve增加maxDays=“7”属性
     *
     * @param maxDays
     */
    public void setServerMaxDays(String maxDays) {
        try {
            // 创建DOM解析器工厂
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 创建DOM解析器
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 读取XML文件
            Document doc = builder.parse(new File(tomcatServer));
            // 获取根元素
            Element root = doc.getDocumentElement();
            // 获取要改变的元素
            // 根据标签名称获取标签元素列表
            NodeList propertyEleList = root.getElementsByTagName("Valve");
            for (int i = 0; i < propertyEleList.getLength(); i++) {
                Node node = propertyEleList.item(i);
                Element propertyEle = (Element) node;
                String name = propertyEle.getAttribute("className");
                if (StringUtils.equals(name, "org.apache.catalina.valves.AccessLogValve")) {
                    propertyEle.setAttribute("maxDays", maxDays);
                    break;
                }
            }
            // 将更改后的XML文件保存到磁盘
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            transformer.transform(new DOMSource(doc), new StreamResult(new File(tomcatServer)));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上代码是完整的修改方法,可以直接用,下面的是重写Properties,以保证修改完后的顺序 Properties prop = new OrderedProperties();

package com.sinorail.web.controller.system.action;

import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Properties;
import java.util.Set;

/**
 * OrderedProperties
 *
 * @author wangchang
 * @date 2023/9/20 14:04
 * @userd 重写Properties使得改变Properties属性有序
 */
public class OrderedProperties extends Properties {

    private static final long serialVersionUID = 4710927773256743817L;

    private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>();

    @Override
    public Enumeration<Object> keys() {
        return Collections.<Object>enumeration(keys);
    }

    @Override
    public Object put(Object key, Object value) {
        keys.add(key);
        return super.put(key, value);
    }

    @Override
    public Set<Object> keySet() {
        return keys;
    }

    @Override
    public Set<String> stringPropertyNames() {
        Set<String> set = new LinkedHashSet<String>();

        for (Object key : this.keys) {
            set.add((String) key);
        }

        return set;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王之蔑视.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值