精华内容
下载资源
问答
  • 在使用slf4j的logback实现时,使用TimeBasedRollingPolicy根据时间滚动日志策略并使用RollingFileAppender进行日志滚动,多进程共用同一个日志文件时,会出现较多xxxxxx.tmp文件删除的情况。 出现tmp文件的条件:...

    在使用slf4j的logback实现时,使用TimeBasedRollingPolicy根据时间滚动日志策略并使用RollingFileAppender进行日志滚动,多进程共用同一个日志文件时,会出现较多xxxxxx.tmp文件未删除的情况。

    出现tmp文件的条件: 使用TimeBasedRollingPolicy/RollingFileAppender配置,并启用压缩,并配置的<file></file>标签名称与滚动名称模板不同(如打印日志时文件名为demo.log,归档时文件名demo.2019-12-12.log.gz),并且单应用启动多实例共用一个日志文件作为输出,例如:

    	<appender name="File"
    		class="ch.qos.logback.core.rolling.RollingFileAppender">
    		<file>${LOG_HOME}/demo.log</file>
    		<rollingPolicy
    			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    			<FileNamePattern>${LOG_HOME}/demo.log.%d{yyyy-MM-dd}.log.gz
    			</FileNamePattern>
    			<MaxHistory>30</MaxHistory>
    		</rollingPolicy>
    		<encoder
    			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern>
    		</encoder>
    	</appender>

    多进程将日志输出到同一个日志文件logback是允许的,仅输出也不会出现问题,但是当归档时,多个进程同时归档,原文件与目标文件(归档文件)名称不同时,会首先关闭输出流,然后将原日志文件rename为xxx.timestamp.tmp,然后读取tmp文件输出到目标归档文件,此时如果是多进程,其他进程那一时刻很有可能没有关闭输出流,所以tmp文件内容一致再增加,并且当其他进程开始归档时也会同样的流程创建tmp文件,然是创建tmp文件后,后续判断归档文件已存在,直接返回了,导致tmp文件未被删除。

    解决方法:

    1. 不压缩(但是多进程也存在问题,日志输出混乱,某个时间点的日志可能出现在上一个时间点日志文件内)

    2. 删除<file>xxx</file>标签,此时产生的日志文件名与归档文件名相同(归档文件后缀.gz/zip),不需要创建临时文件,直接压缩原文件,压缩完毕会删除原文件(可能会丢日志,因为其他进程还在往里面写)

    3. 多进程配置不同的logback配置文件,日志分开存储

    4. appender标签启用<prudent>true</prudent>, logback允许多jvm使用同一个log日志,启用该标志会加锁,在日志输出每秒<100条时性能影响不大,但是不使用该功能要比使用该功能日志性能高3倍左右。局限性就是不能日志使用压缩功能,不能使用<file>标签指定日志文件名,详细参考:prudent   prudentWithRolling

    源码解析如下:

        //RollingFileAppender
        public void rollover() {
            //加锁,统一进程同一时刻只会有一个归档操作
            lock.lock();
            try {
                //关闭日志输出流
                this.closeOutputStream();
                //归档,删除过期文件(如保留30天内,则超过30天的文件被删除)
                attemptRollover();
                //重新创建或打开日志文件,并设置输出流
                attemptOpenFile();
            } finally {
                lock.unlock();
            }
        }
        
        private void attemptRollover() {
            try {
                //调用滚动策略滚动归档日志
                rollingPolicy.rollover();
            } catch (RolloverFailure rf) {
                addWarn("RolloverFailure occurred. Deferring roll-over.");
                // we failed to roll-over, let us not truncate and risk data loss
                this.append = true;
            }
        }
       //TimeBasedRollingPolicy 1.1.7
       public void rollover() throws RolloverFailure {
    
            //该方法被执行时,会认为日志文件为已关闭
            String elapsedPeriodsFileName = timeBasedFileNamingAndTriggeringPolicy.getElapsedPeriodsFileName();
    
            String elapsedPeriodStem = FileFilterUtil.afterLastSlash(elapsedPeriodsFileName);
            //压缩模式,FileNamePattern标签对应的文件后缀,.gz .zip,否则不压缩
            if (compressionMode == CompressionMode.NONE) {
                //获取file标签是否配置,如果配置了,则将原文件重命名为归档文件
                if (getParentsRawFileProperty() != null) {
                    renameUtil.rename(getParentsRawFileProperty(), elapsedPeriodsFileName);
                } // else { nothing to do if CompressionMode == NONE and parentsRawFileProperty == null }
            } else {
                //file标签没有配置,直接将原文件压缩为目标归档文件
                if (getParentsRawFileProperty() == null) {
                    compressionFuture = compressor.asyncCompress(elapsedPeriodsFileName, elapsedPeriodsFileName, elapsedPeriodStem);
                } else {
                //配置了file标签则需要先重命名为tmp,然后读取tmp输出到归档压缩文件
                    compressionFuture = renamedRawAndAsyncCompress(elapsedPeriodsFileName, elapsedPeriodStem);
                }
            }
            //删除过期文件
            if (archiveRemover != null) {
                Date now = new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime());
                cleanUpFuture = archiveRemover.cleanAsynchronously(now);
            }
        }
        //重命名并压缩归档
        Future<?> renamedRawAndAsyncCompress(String nameOfCompressedFile, String innerEntryName) throws RolloverFailure {
            String parentsRawFile = getParentsRawFileProperty();
            //tmp文件名
            String tmpTarget = parentsRawFile + System.nanoTime() + ".tmp";
            //重命名
            renameUtil.rename(parentsRawFile, tmpTarget);
            //异步压缩
            return compressor.asyncCompress(tmpTarget, nameOfCompressedFile, innerEntryName);
        }
        //Compressor 异步压缩
        public Future<?> asyncCompress(String nameOfFile2Compress, String nameOfCompressedFile, String innerEntryName) throws RolloverFailure {
            //参数:原文件,归档文件
            CompressionRunnable runnable = new CompressionRunnable(nameOfFile2Compress, nameOfCompressedFile, innerEntryName);
            ExecutorService executorService = context.getExecutorService();
            //提交线程池
            Future<?> future = executorService.submit(runnable);
            return future;
        }
        // 压缩
        public void compress(String nameOfFile2Compress, String nameOfCompressedFile, String innerEntryName) {
            //gz zip压缩
            switch (compressionMode) {
            case GZ:
                gzCompress(nameOfFile2Compress, nameOfCompressedFile);
                break;
            case ZIP:
                zipCompress(nameOfFile2Compress, nameOfCompressedFile, innerEntryName);
                break;
            case NONE:
                throw new UnsupportedOperationException("compress method called in NONE compression mode");
            }
        }
    
        private void gzCompress(String nameOfFile2gz, String nameOfgzedFile) {
            File file2gz = new File(nameOfFile2gz);
            //原文件不存在直接返回,注意此时tmp文件没有被删除
            if (!file2gz.exists()) {
                addStatus(new WarnStatus("The file to compress named [" + nameOfFile2gz + "] does not exist.", this));
    
                return;
            }
            //如果没有gz后缀,则加个后缀
            if (!nameOfgzedFile.endsWith(".gz")) {
                nameOfgzedFile = nameOfgzedFile + ".gz";
            }
            //归档文件
            File gzedFile = new File(nameOfgzedFile);
            //归档文件是否存在,已存在直接返回,注意此时tmp文件没有被删除
            if (gzedFile.exists()) {
                addWarn("The target compressed file named [" + nameOfgzedFile + "] exist already. Aborting file compression.");
                return;
            }
    
            addInfo("GZ compressing [" + file2gz + "] as [" + gzedFile + "]");
            createMissingTargetDirsIfNecessary(gzedFile);
    
            BufferedInputStream bis = null;
            GZIPOutputStream gzos = null;
            //读取tmp文件输出到归档文件
            try {
                bis = new BufferedInputStream(new FileInputStream(nameOfFile2gz));
                gzos = new GZIPOutputStream(new FileOutputStream(nameOfgzedFile));
                byte[] inbuf = new byte[BUFFER_SIZE];
                int n;
    
                while ((n = bis.read(inbuf)) != -1) {
                    gzos.write(inbuf, 0, n);
                }
    
                bis.close();
                bis = null;
                gzos.close();
                gzos = null;
                //删除临时文件,这个地方有个问题如果上面抛异常了,tmp文件依旧删不掉
                //1.3.0版本该部分移到了try-catch后面
                if (!file2gz.delete()) {
                    addStatus(new WarnStatus("Could not delete [" + nameOfFile2gz + "].", this));
                }
            } catch (Exception e) {
                addStatus(new ErrorStatus("Error occurred while compressing [" + nameOfFile2gz + "] into [" + nameOfgzedFile + "].", this, e));
            } finally {
                if (bis != null) {
                    try {
                        bis.close();
                    } catch (IOException e) {
                        // ignore
                    }
                }
                if (gzos != null) {
                    try {
                        gzos.close();
                    } catch (IOException e) {
                        // ignore
                    }
                }
            }
        }

     

    展开全文
  • java--删除TMP文件

    2019-11-29 17:11:16
    实验目的 (1)了解Flie类的概念。 (2)掌握File类的用法。 (3)掌握使用迭代遍历文件夹的方式。 ...(1)了解Java的输入/输出操作...编写TmpFileDeletion类,在该中定义deleteTmpFile()方法,用于删除单个TMP文件...
    • 实验目的

    (1)了解Flie类的概念。

    (2)掌握File类的用法。

    (3)掌握使用迭代遍历文件夹的方式。

    • 实验内容

    (1)了解Java的输入/输出操作。

    (2)学会文件与目录管理。

    (3)编写TmpFileDeletion类删除指定文件夹包括子文件夹中全部TMP文件。

    • 实验步骤
    1. 编写TmpFileDeletion类,在该中定义deleteTmpFile()方法,用于删除单个TMP文件。定义deleteTmpFlies()方法用于删除文件夹中全部TMP文件。在main()方法中进行测试。代码如下:

    import java.io.File;

    public class TmpFileDeletion {

        public static void deleteTmpFile(File tmpFile) {

            String name = tmpFile.getName();

            if(name.endsWith(".tmp")||name.endsWith(".TMP")){

                tmpFile.delete();

            }

        }

        public static void deleteTmpFiles(File root) {

            if(root.isDirectory()){

                File[] files = root.listFiles();

                for (File file:files){

                    if(file.isDirectory()){

                        deleteTmpFiles(file);

                    }

                    if(file.isFile()){

                        deleteTmpFile(file);

                    }

                }

            }

            if(root.isFile()){

                deleteTmpFile(root);

            }

        }

        public static void main(String[] args) {

            File root = new File("tmp/");

            deleteTmpFiles(root);

        }

    }

    1. 在同目录下新建”Tmp”文件夹,并在其中添加”TMP”文件进行测试,运行程序后可以发现所有”TMP”文件都被删除。
    • 实验结果

    运行程序,效果如图所示。

    1. 程序运行之前:

    图 1

    (2)程序运行之后:

    图 2

    展开全文
  • 在将从reuqest中接收到的MultipartFile,transferTo到指定目录后,无法自动删除,手动删除时提示被占用了 源码如下: 因为我已经把transferTo后面的文件操作代码都注释了,应该存在占用情况,但现在问题就是这样,...
  • 关于linux tmp文件自动删除的问题

    千次阅读 2021-02-21 17:31:34
    事件起源:昨天值班过程中,应用...本来以为是哪位写了一个自动执行脚本, find 了一下10天前的文件删除了…. 结果,排查所有用户的crontab 计划,没有任何用户执行了自动脚本 监测了一下服务器登录情况,在删除文件

    事件起源:昨天值班过程中,应用组同事反馈一台linux机器的/tmp目录下自己放的脚本没有了,而且脚本相对挺重要,瞬时冷汗冒出。

    作为一名运维工程师最怕删东西,找值班同事及系统组同事确认后,没有人为清理,不过有人提出了:

    tmp不是自动会清理么?

    抓紧时间排查后发现是自动丢失,并且,只是删除10天之前的文件….

    本来以为是哪位写了一个自动执行脚本, find 了一下10天前的文件删除了….

    结果,排查所有用户的crontab 计划,没有任何用户执行了自动脚本

    监测了一下服务器登录情况,在删除文件期间也没有任何人登录

    最终,通过不懈的百度,终于找到正解

    从/var/log/cron 日志中发现,服务器除了调用用户的计划任务外,还会执行系统自己的,比如:

    /etc/cron.hourly

    /etc/cron.daily

    进入 /etc/cron.daily

    可以看到一个tmpwatch

    cat  tmpwatch

    flags=-umc
    
    /usr/sbin/tmpwatch “$flags” -x /tmp/.X11-unix -x /tmp/.XIM-unix \
    
    -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /tmp
    
    /usr/sbin/tmpwatch “$flags” 720 /var/tmp
    
    for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    
    if [ -d "$d" ]; then
    
    /usr/sbin/tmpwatch “$flags” -f 720 “$d”
    
    fi
    
    done

     

    可以看到调用了一个叫tmpwatch 的脚本,并且,我们可以看到传入参数中 对我们有意义的有 /tmp  240

    然后我们 man tmpwatch

    SYNOPSIS

    tmpwatch [-u|-m|-c] [-MUadfqstvx] [--verbose] [--force] [--all]

    [--nodirs] [--nosymlinks] [--test] [--fuser] [--quiet]

    [--atime|--mtime|--ctime] [--dirmtime] [--exclude <path>]

    [--exclude-user <user>] <hours> <dirs>

    有一个 hours

    240 = 10*24 整好是10天

    总结: tmp是一个特殊的文件夹,系统会自动清理,所以大家最好不要把重要文件放到这个地方,被清理了就不好了。

    展开全文
  • 有时候我们在编辑word文档的时候,发现word文档突然响应了 然后就是word文件“不见了”(其实是隐藏了),解除隐藏点这 ...不要担忧,也不要将temp文件删除,相信会有合适的解决方案的。 ...

    有时候我们在编辑word文档的时候,发现word文档突然不响应了

    然后就是word文件“不见了”(其实是隐藏了),解除隐藏点这

    如果你通过上述方法,发现文件变成了temp文件,然后还是打不开,那么点这

    通过上面的操作,应该没啥问题了。不要担忧,也不要将temp文件给删除,相信会有合适的解决方案的。

    展开全文
  • 如果您想将临时目录和文件存储在标准OS临时目录中,则也可以随意覆盖它。 有关兼容性的重要说明 有关更多信息,请参见 。 版本0.1.0 从0.1.0版开始,对<0.10.0版的节点版本的所有支持均已删除。 最重要的是...
  • 解决WPS每点击一下保存,就会出现tmp文件,而且该文件属于非隐藏文件,可以删除。 是系统临时文件的环境变量被修改造成的,改回正确路径后重启即可,步骤如下: 1、按win+r,输入sysdm.cpl,点击确定; (sysdm....
  • hadoop无法自动生成tmp文件

    千次阅读 2019-11-12 11:29:11
    conf.set(“hadoop.tmp.dir”, “E:\tmp\hadoop-abc”); // conf.set(“mapreduce.framework.name”, “local”); Job job = Job.getInstance(conf); // 指定本次job运行的主类 job.setJarByClass...
  • linux 下tmp目录文件怎么被删除的?

    千次阅读 2017-08-07 17:06:00
    tmp目录下文件什么时候会删除?写这篇文章是我要重启长时间运行的hadoop集群的时候,关闭了相应的服务。查看shell脚本看到,要找到服务的pid文件,才能重启,一般情况下pid文件都会存储在tmp目录下,但是pid文件却...
  • tmp目录下文件删除

    千次阅读 2017-12-05 15:23:49
    描述:线上服务器tmp目录下有一目录用来接收部署系统发送的压缩文件并解压到运行目录,但是该目录多次消失导致部署报错 分析:想起来centos6系统中有tmpwatch文件配置tmp目录内容自动清除机制,查询发现centos7下改...
  • tmp 格式无法删除的问题

    千次阅读 2010-03-21 11:56:00
    ,F盘突然出现了 tmp格式 的文件夹(不知道怎么出现 的) 怎么都 删不掉,提示文件是只读 或是其它程序用使用它 卡巴 360 也杀不出毒 并且以肉眼可见的速度不断生成 在摆渡上搜的方法, 进入安全模式下去删除 ...
  • CentOS清理tmp下临时文件

    千次阅读 2019-04-10 09:26:29
    因为跑爬虫,在某一天发现磁盘沾满了,后来发现是tmp下临时文件太多了 两种清理: #清理十天前的 find /tmp -ctime +10 -exec rm -rf {} + #写脚本定时清理 使用tmpwatch命令最短可清理一小时未用的 首先下载...
  • 重命名文件、移动文件、删除等操作时出现.svntmp文件,并弹出 An internal error occurred during: "更新 SVN 状态". java.lang.NullPointerExc; 解决方案: 关闭并重启eclipse,把文件的.svntmp去掉...
  • /tmp目录文件重启后自动删除现在知道有ubuntu和solaris系统source:http://blog.chinaunix.net/uid-26212859-id-3567875.html经常会把临时性的log或抓包等文件放在/tmp目录下,重启后发现文件都丢失了。查下资料发现...
  • 本来以为是哪位写了一个自动执行脚本, find了一下10天前的文件删除了。 结果,排查所有用户的crontab计划,没有任何用户执行了自动脚本。 监测了一下服务器登录情况,在删除文件期间也没有任何人登录。 解释: ...
  • JAVA 操作写入文件,未完成时使用.tmp,写完后更改为.log(即.tmp到正式文件);
  • 摘要 flume打到hdfs上时,按照文件大小生成文件,在达到指定大小之前数据都是以.tmp文件形式保存在hdfs上,hive外部表也会加载这些文件,但是当文件完成后.tmp会消失,这时候hive会报找到文件的错误。类似于:...
  • ubuntu系统下tmp文件夹下文件一般默认重启自动删除 当然你可以更改这些设置 像我刚开始知道,东西放里面,重启不见了。。。很抓狂。。。 当然如果小心很重要东西放里面重启消失了怎么恢复呢? 这里用的是...
  • 在使用LogBack打印日志,并根据每天和自定义大小拆分压缩文件时,**出现上百G的tmp文件,不会自动删除,另外,出现tmp没有删除的情况时,压缩文件里面的文件是空的。** 请问是什么情况,是否可以优化logback的配置...
  • ubuntu的tmp目录下自己创建的文件每次重启后自动删除。 可以修该/etc/default/rcS文件中的内容而改变为自动删除。 输入命令:vim /etc/default/rcS 开始编辑 将TMPTIME=0改为TMPTIME=-1,保存并退出即可。 ...
  • 如何保留/tmp文件夹下的指定文件 有详细的步骤和操作流程,简单易学,是本人在工作过程中的经验积累。
  • [Linux] Linux中/tmp目录下文件莫名丢失

    千次阅读 2019-01-11 10:17:00
    &amp;amp;amp;gt; 删除一段时间没有被访问的文件
  • 在更新svn时候提示提示目录下多出了一个xx.tmp文件,查看只有确实存在这个文件,然后尝试clean up,结果每次clean都会产生一个.tmp文件,并且提示文件目录locked 无奈之下只能把隐藏文件.svn打开,然后把tmp目录下...
  • 编辑文件/usr/lib/tmpfiles.d/tmp.conf vim /usr/lib/tmpfiles.d/tmp.conf 有如下信息: v /tmp 1777 root root 10d #清理/tmp目录下10天前的临时文件 v /var/tmp 1777 root root 30d #清理/var/tmp目录下30天...
  • 技术支持反馈前几天还好好的文件上传功能今天报错了,首先考虑到的是可能有bug,但测试了各个其他部署的环境,均没有发现问题,考虑到错误环境为独立部署,所以重点放在服务器的差异排查上。根据如下日志, 2019-02...
  • 简单tmp清理工具

    2013-10-25 10:31:57
    简单tmp 清理工具 傻瓜工具 批处理文件 可以一键清理系统tmp文件残留
  • JAVA清空tomcat下temp中的.tmp临时文件

    千次阅读 2019-11-20 12:43:41
    JAVA清空tomcat下temp中的.tmp临时文件 由于引入的某些第三方jar包在tomcat下产生了大量临时文件,使用JAVA程序对其进行清除。 代码 try { File file = new File("../temp"); //找到temp文件夹,生成一个File...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 277,142
精华内容 110,856
关键字:

tmp文件删除不了