生成日志文件,并在0点进行备份(java 实现)

本文介绍了一种日志文件的生成与管理方法,包括如何根据数据库查询结果更新日志文件,并实现每天0点的数据备份及过期数据清理功能。

1、生成日志文件(有新数据产生时,将新的数据另起一行追加到日志文件中)


public void wirte(){
        backup();
        List<String> alTag_Real2 = new ArrayList<String>();
        List<String> alVal_Real2 = new ArrayList<String>();
        List<String> alTime_Real2 = new ArrayList<String>();

        StringBuffer sql = new StringBuffer(
                "select xxx from xxx where xxx and tag_name in (");
        for (String tagName : tagNameList2) {
            sql.append("'");
            sql.append(tagName);
            sql.append("',");
        }
        String sqlend2 = sql.substring(0, sql.length() - 1);
        sqlend2 = sqlend2 + ")";

        List<Mini_List> resList = new ArrayList<Mini_List>();
        try {
            Connection conn = DBUtils.feachConnection();
            Statement statement = conn.createStatement();
            ResultSet resultSet = statement.executeQuery(sqlend2);
            resList = new ArrayList<Mini_List>();
            while (resultSet.next()) {
                Mini_List mini_List3 = new Mini_List();
                mini_List3.setName(resultSet.getString(1));
                mini_List3.setIp_input_value(resultSet.getString(2));
                mini_List3.setIp_input_time(resultSet.getString(3));
                resList.add(mini_List3);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        for (Mini_List mini_List3 : resList) {

            String name = mini_List3.getName();
            mini_List3Time:"+mini_List3.getIp_input_time());
            //上次时间为空   或者   当前位点数据的时间与上次时间不同 
            if (null == htLastTime2.get(name)
                    || !htLastTime2.get(name).toString().equals(
                            mini_List3.getIp_input_time().toString())) {

                htLastTime2.put(name,mini_List3.getIp_input_time());
                Double value = mini_List3.getIp_input_value() == "" ? Double.NaN : Double.parseDouble(mini_List3.getIp_input_value());

                if (!Double.isNaN(value)){
                    //实时数据列表增加数据
                    alTag_Real2.add(name);
                    alVal_Real2.add(mini_List3.getIp_input_value());
                    alTime_Real2.add(mini_List3.getIp_input_time());
                }

            }
        }


        for (int i = 0; i < alTag_Real2.size()-1; i++) {
            if(!new File(path).exists()){
                new File(path).mkdirs();
            }
            File file  = new File(path+alTag_Real2.toArray()[i]+".txt");
            if(!file.exists()){
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    logger.info("创建"+alTag_Real2.toArray()[i]+"点位文件失败");
                }
            }
            try {
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(new FileOutputStream(file, true)));
                writer.write(alTag_Real2.toArray()[i]+"       "+alTime_Real2.toArray()[i]+"       "+alVal_Real2.toArray()[i]+"       "+"Good");
                writer.newLine();
                writer.flush();
            } catch (FileNotFoundException e) {
                logger.info("写入"+alTag_Real2.toArray()[i]+"点位文件失败");
            } catch (IOException e) {
                logger.info("写入"+alTag_Real2.toArray()[i]+"点位文件失败");
            }
        }
    }

2、在每天的0点备份(备份数据超过15天后删除超出部分的数据)


public static void backup() {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String dateformat = sdf.format(date.getTime() - 24 * 60 * 60 * 1000);//获取昨天的日期
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        if ((calendar.get(Calendar.HOUR) == 0) && (calendar.get(Calendar.MINUTE) == 0)) {
            List<String> files = new ArrayList<String>();
            List<String> dirFile = new ArrayList<String>();
            List<String> toDel = new ArrayList<String>();
            File dir = new File(path);
            File[] allFile = dir.listFiles();

            for (File name : allFile) {
                if (name.isFile()) {
                    files.add(name.getName());
                } else {
                    dirFile.add(name.getPath());
                }
            }


            // 执行删除15天之前的数据
            if (dirFile.size() > 15) {
                int index = Integer.parseInt(dateformat);
                for (int i = 16; i < dirFile.size()+2; i++){
                    String before = sdf.format(date.getTime() - i * 24 * 60 * 60 * 1000);//获取第 i天的日期
                    if (new File(path + "sj" + before).exists()) toDel.add(path + "sj" + before);
                }
                for (String file : toDel) {
                    File file2 = new File(file);
                    File[] listFiles = file2.listFiles();
                    if(listFiles.length>0){
                        for (File file3 : listFiles) {
                            file3.delete();
                        }
                    }
                    file2.delete();
                }
            }

            // 执行备份
            File file4 = new File(path + "sj" + dateformat);
            if(!file4.exists()){
                file4.mkdirs();
                for (String string : files) {// file.renameTo(new File("PATH\OF\THE\DISTINATION")) 将文件移动到指定
                    new File(path + string).renameTo(new File(path + "sj" + dateformat + "\\" + string));
                }
            }

        }
    }

3、主要代码之外部分


    // 位点上一时刻记录
    private static Hashtable<String,String> htLastTime2 = new Hashtable<String,String>();
    // 获取文本数据存放路径
    private static String path;
    static { 
        Properties prop = new Properties(); 
        InputStream in = Object.class.getResourceAsStream("/file.properties"); //   path=X://zzz//
        try { 
            prop.load(in); 
            path = prop.getProperty("path").trim(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    }
### Java生成日志文件存储到指定目录的方法 在Java生成日志文件将其保存到指定目录,可以通过多种方式实现。以下是基于Log4j和Logback两种常见日志框架的解决方案。 #### 使用Log4j生成日志文件存储到指定目录 Log4j是一个流行的日志框架,支持将日志输出到文件且可以配置日志文件的路径、大小限制、备份策略等。以下是一个完整的示例配置: 1. **添加Log4j依赖**(如果尚未添加): ```xml <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> ``` 2. **配置Log4j属性文件**(`log4j.properties`): ```properties log4j.rootLogger=INFO, truckInfo # 配置日志输出到文件 log4j.appender.truckInfo=org.apache.log4j.DailyRollingFileAppender log4j.appender.truckInfo.File=/LOGS/logs/truck_info.log # 日志文件路径 log4j.appender.truckInfo.DatePattern='_' yyyy-MM-dd # 每天生成一个日志文件 log4j.appender.truckInfo.MaxFileSize=50MB # 单个日志文件最大大小 log4j.appender.truckInfo.Append=true # 是否追加写入 log4j.appender.truckInfo.Threshold=INFO # 日志级别 # 日志格式 log4j.appender.truckInfo.layout=org.apache.log4j.PatternLayout log4j.appender.truckInfo.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ``` 3. **使用Log4j记录日志**: ```java import org.apache.log4j.Logger; public class LogExample { private static final Logger logger = Logger.getLogger(LogExample.class); public static void main(String[] args) { logger.info("This is an info message."); logger.error("This is an error message.", new Exception("Test exception")); } } ``` 上述代码将日志输出到指定目录 `/LOGS/logs/`,且每天生成一个新的日志文件[^2]。 --- #### 使用Logback生成日志文件存储到指定目录 Logback是Log4j的升级版,功能更强大且性能更高。以下是基于Logback的解决方案。 1. **添加Logback依赖**: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> ``` 2. **配置Logback配置文件**(`logback.xml`): ```xml <configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/LOGS/logs/application.log</file> <!-- 日志文件路径 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/LOGS/logs/application-%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 每天生成一个日志文件 --> <maxHistory>30</maxHistory> <!-- 保留最近30天的日志 --> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="FILE" /> </root> </configuration> ``` 3. **使用Logback记录日志**: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogbackExample { private static final Logger logger = LoggerFactory.getLogger(LogbackExample.class); public static void main(String[] args) { logger.info("This is an info message."); logger.error("This is an error message.", new Exception("Test exception")); } } ``` 上述代码通过Logback将日志输出到指定目录 `/LOGS/logs/`,且每天生成一个新的日志文件[^3]。 --- ### 总结 无论是使用Log4j还是Logback,都可以轻松实现日志文件生成和存储到指定目录。选择具体框架时,可以根据项目需求和团队技术栈进行决策。Log4j适合简单场景,而Logback则更适合复杂和高性能场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值