精华内容
下载资源
问答
  • 在使用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
                    }
                }
            }
        }

     

    展开全文
  • 无法自动删除,手动删除时提示被占用了 源码如下: <p><img alt="" height="391" src="https://img-ask.csdnimg.cn/upload/1613719511960.png" width="833" /></p> 因为我已经把transferTo后面的文件...
  • 删除无法删除文件

    2010-12-30 21:48:00
    如何删除无法删除的文件有时候我们在删除某个文件或文件夹时,系统提示无法删除... 无法删除的相关搜索 无法删除访问被拒绝 无法删除文件夹 无法删除文件 文件无法删除怎么办 tmp文件无法删除 添加删除程序无法删除 ...

    如何删除无法删除的文件有时候我们在删除某个文件或文件夹时,系统提示无法删除,这确实令人十分头疼,现在我们就来看看解决的办法。

    彻底解决文件无法删除的小技巧 被删除的文件正在被调用,这是无法删除中碰到最多的。如果是该文件正在打开或运行,那么直接将其关闭即可。

    无法删除的相关搜索 无法删除访问被拒绝 无法删除文件夹 无法删除文件 文件无法删除怎么办 tmp文件无法删除 添加删除程序无法删除 打印机无法删除 移动硬盘无法删除

    都可以用unlock解决

    http://www.realsun.com/uploads/allimg/090222/213J63450-1.jpg

    http://pic1.xilu.com/195/390610/781220278/2663c3087f414bb3d1546942f50bb6fa.t9.jpg

    http://www.vipcn.com/uploadImages/2007-4-30/20074307304761939.jpg

    Unlocker 1.9.5 有效解决无法删除文件

    Smile

    Donwload 软件地址:↓Download...

    展开全文
  • tmp 格式无法删除的问题

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

      最近不知怎么的 ,F盘突然出现了 tmp格式 的文件夹(不知道怎么出现 的) 怎么都 删不掉,提示文件是只读 或是其它程序用使用它  卡巴 360  也杀不出毒  并且以肉眼可见的速度不断生成  在摆渡上搜的方法,   进入安全模式下去删除  可是还是不行 同样提示文件是只读 或是其它程序用使用它  。

             后来 ,无意中右点文件的属性一看 在文件的权限 中只有everyone  ,并且只有只读权限,没有修改的,难怪删不掉 ,于是 点添加按钮 ,添加一个用户:如管理员或是 system ,并将其权限设为完全 ,这样就可以删除这些文件了。

    展开全文
  • 自从安装卡巴斯基2009后,编辑EXCEL文件后,同一目录就会自动出现两个TMP后缀文件,而且还不是隐藏文件,也无法删除,试了很多办法,重装几个版本OFFICE都没用。现提供两种解决办法:方法一、a. 关闭卡巴斯基的自我...

           自从安装卡巴斯基2009后,编辑EXCEL文件后,同一目录就会自动出现两个TMP后缀文件,而且还不是隐藏文件,也无法删除,试了很多办法,重装几个版本OFFICE都没用。
    现提供两种解决办法:
    方法一、
    a. 关闭卡巴斯基的自我保护(方法:打开卡巴斯基的设置界面,点击选项---启用自我保护,将前面的勾去掉,点击确定。)
    b.在开始---运行里,输入regedit,打开注册表,浏览到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\KLIF\Parameters 新建NonCachedIo,类型Dword,健值为1。
    C. 重启计算机,启用卡巴斯基的自我保护。
    重启后,以前的TMP文件可以删除,编辑OFFICE文件也不产生这种文件了。至此问题解决,希望对同样安装了卡巴2009的朋友有所帮助。
    方法二、
    卡巴中:设置----保护----反恶意程序----文件和内存----启用文件和内存保护----设置----附加,将“快速模式”改为“访问和修改时”或者“访问时”

    展开全文
  • 由于是使用的阿里云的小.../tmp目录产生大量小文件,使用rm等均无法删除(”-bash: /bin/rm: Argument list too long“),这里关注下tmpwatch,系统为保证tmp目录不被撑爆,默认情况下每日会处理一次tmp目录文件,...
  • 错误背景 原始内核版本为5.4.0,操作系统实验编译了内核5.9.10,出现了一些问题: 虚拟机启动ubuntu系统是提示客户机操作系统已禁用CPU,请关闭或重置...删除到最后发现/var/tmp下有几个目录里还有5.9.10的文件,查了下
  • 如何创建一个目录,让各自创建者在此目录里面只能删除自己创建的文件,而不能删除其他用户所创建的文件? 我们可以通过命令ls -ld来查看一下/tmp这个目录的相关信息:我们可以发现/tmp这个目录的其他用户有一个t的权限,...
  • linux下无法删除文件

    千次阅读 2016-04-13 15:07:57
    有时,使用rm -rf filename命令,却无法删除文件。出现: rm: cannot remove `/tmp/tmptmp/.journal': Operation not permitted mkdir: cannot create directory `/tmp/tmptmp': File exists 这种情况往往...
  • POI读取Word文件之后,文件一直被占用,无法删除 使用poi读取word文件之后,文件无法删除,一直正在使用 在操作完word文件之后也关闭了流,并在操作完成之后删除源文件,代码看着好像是没有问题 ...
  • 各位高手前辈们,我写了一个shell脚本,作用是给rm命令添加了回收站。 比如将删除的文件移到/home/trash中 ...比如trash下面有一个 .tmp文件,那么通过执行rm -rf /home/trash/*时无法删除的,不知道为什么?
  • linux下无法删除文件的原因

    万次阅读 2012-02-12 20:19:38
    有时,使用rm -rf filename命令,却无法删除文件。出现: rm: cannot remove `/tmp/tmptmp/.journal': Operation not permitted mkdir: cannot create directory `/tmp/tmptmp': File exists 这种情况往往...
  • 处理rm -rf 无法删除文件

    万次阅读 2013-12-17 17:42:31
    此时在tmp文件夹发现.sh文件 root用户删除的时候不允许删除 此时此文件已经被隐藏了,并且设置了权限,root用户不可删除和mv lsattr 文件名 查看此文件属性 可以看到此文件有-i 和-a属性,此时我们只要将此属性...
  • <p>xampp中文件单个删除只剩下tmp显示权限不足,mysql文件无法删除,mysqlzt服务计算机服务显示已停止,任务管理器中无法控制 <p>apachezt已停止 如何删除这些文件 <p style="text-align:center"><img alt="" ...
  • 采坑重要,Linux在/tmp目录会定期删除一些文件和文件夹, 如30天周期,当然hadoop进程pid文件存放/tmp目录下时,是有被删除风险,生产中出现过这种情况,重启hadoop,jps进程未减少,但是新的和旧的进程混在了一起,...
  • 今天上午在centos系统上删除了原来安装的php和nginx程序以及配置文件,准备重新...Can't connect to local MySQL server through socket 以及/tmp/mysql.sock文件不存在问题。 我先网上查了一下。以为是权限问题。ch
  • 通过工程师分析检查,空间占用最多的文件是临时文件而且无法直接删除。临时文件格式是prf###.tmp ※ 此文件格式曾经遇到过,我有一些印象的。不过为指导工程师排查,我给他说了如下方法。授人以渔比较重要 通过微软...
  • 删除文件过多时,会出现Argument list too long的错误提示;出现该问题后,可以使用如下方式进行处理。简单汇总:使用xargs命令结合find使用find.-name"*"|xargsrm-rf'*'使用find -exec 遍历,然后执行删除便可。...
  • 1、问题背景 Ubuntu版本:12.10 64bit 其实刚开始并不是从提升速度的角度来考虑采用tmpfs的,而是我需要让/... 有一次博文提到了Ubuntu文件的安全删除(http://my.oschina.net/noahxiao/blog/77261),但无法解...
  • 导出待删除namespace的json文件 kubectl get namespace jenkins -o json > tmp.json 删除tmp.json中的spec内容 删除删除后 通过api接口执行删除操作 为证书用户添加权限 apiVersion: rbac....
  • Received error when attempting to archive files ([class org.apache.hadoop.hbase.backup.HFileArchiver$FileablePath, file:hdfs://hdp:9000/hbase/.tmp/data/WMBIGDATA/LAT_LNG_INDEX/310c6...
  • 很可能其中一个文件是误添加的,所以你要找出是哪一个,然后删除它,以确保不会把更改提交到错误的文件。 某个文件的文件名是非法的(对Windows来说非法),比如,"con", "lpr", "com"都是非法的,因为这些都是设备...
  • 2、删除tmp.json的中的删除文件中spec.finalizers字段 注:要删掉中括号中的所有。 删除红框内的数据 3、重新开一个窗口,先克隆一个新会话,执行 kubectl proxy --port=8081 然后执行: curl -k -H “Content-Type...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 314
精华内容 125
关键字:

tmp文件无法删除