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;
}
}