logback 打印出来的日志上传ftp显示程序被占用(贴的代码不重要,和网上代码是一样的) 5C

请问各位大佬,logback打印是个什么原理呢,看情况就像“字节流”(这个表述对吗)一直开着,没有关闭似的,也无法修改日志内容(修改之后,一保存就提示程序占用)

如果像这样“打印日志的服务”一直开着的情况下,那以后并发量大的时候,资源不就很快就被消耗完了。

请问要怎么配置才能打印完一段日志就关闭“服务”以至于不会在操作的时候,显示程序在使用中。

项目运行的日志打印:
logback.xml
的配置如下(和网上配置一样):

 <?xml version="1.0" encoding="UTF-8"?>
<!--
    Copyright 2010-2011 The myBatis Team
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
        http://www.apache.org/licenses/LICENSE-2.0
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <!-- /U01/apps/tomcat-statusServer/statusServer_logs -->
    <!-- <property scope="context" name="LOG_HOME" value="/tomcat-statusServer/statusServer_logs" />  -->
    <property scope="context" name="LOG_HOME" value="/U01/apps/tomcat-statusServer/statusServer_logs" /> 
    <!-- 控制台输出 -->   
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </encoder> 
    </appender>
    <!-- 按照每天生成日志文件 -->   
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">   
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern> 
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>   
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </encoder> 
    </appender> 
   <!-- show parameters for hibernate sql 专为 Hibernate 定制 --> 
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder"  level="TRACE" />  
    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor"  level="DEBUG" />  
    <logger name="org.hibernate.SQL" level="DEBUG" />  
    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />  

    <!--myibatis log configure--> 
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root> 
</configuration>

重写日志打印方法,以实现方法调用日志打印方法的配置:
(我项目里还有通过方法调用logback打印,实现日志按照要求输出到我需要的文件)

调用:

 Logger logger = LoggerBuilder.getLogger(uniteStr);
                logger.info(logAgora);

工具类:

 package com.bell.tempStatus.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
import ch.qos.logback.core.util.FileSize;
import ch.qos.logback.core.util.OptionHelper;  
public class LoggerBuilder {  

    private static final Map<String,Logger> container = new HashMap<>();  

    public static Logger getLogger(String name) {

        Logger logger = container.get(name);  
        if(logger != null) {  
            return logger;  
        }  
        synchronized (LoggerBuilder.class) {  
            logger = container.get(name);  
            if(logger != null) {  
                return logger;  
            }  
            logger = build(name);  
            container.put(name,logger);  
        }  
        return logger;  
    }  

    private static Logger build(String name) {
        //TODO 重写这个方法
        //name = ua + rid + uid
        String[] split = name.split("_");

        String replace = name.replace("_", "");
        int count = name.length() - replace.length();

        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();  
        Logger logger = context.getLogger("FILE-" + name);  
        logger.setAdditive(false);  
        RollingFileAppender appender = new RollingFileAppender();  
        appender.setContext(context);  
        appender.setName("FILE-" + name);
        if(count == 3) {
            //appender.setFile(OptionHelper.substVars("E:/" + split[0] + "/"+ getSysYear() + "/" + getSysMonth() + "/" + split[1] + "_" + split[2] +"_"+ getSysYearMonthDay()+ "_agora" + ".log",context));
            appender.setFile(OptionHelper.substVars("/U01/apps/tomcat-statusServer/statusServer_logs/" + split[0] + "/"+ getSysYear() + "/" + getSysMonth() + "/" + split[1] + "_" + split[2] +"_"+ getSysYearMonthDay()+ "_agora" + ".log",context));
        }
        else {
            appender.setFile(OptionHelper.substVars("/U01/apps/tomcat-statusServer/statusServer_logs/" + split[0] + "/"+ getSysYear() + "/" + getSysMonth() + "/" + split[1] + "_" + split[2] +"_"+ getSysYearMonthDay() + ".log",context));
            //appender.setFile(OptionHelper.substVars("E:/" + split[0] + "/"+ getSysYear() + "/" + getSysMonth() + "/" + split[1] + "_" + split[2] +"_"+ getSysYearMonthDay() + ".log",context));
        }
        appender.setAppend(true);  
        appender.setPrudent(false);  
        SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy();  
        String fp = OptionHelper.substVars("/U01/apps/tomcat-statusServer/statusServer_logs/" + split[0] + "/"+ getSysYear() + "/" + getSysMonth() + "/" + split[1] + "_" + split[2] +"_"+ ".%d{yyyy-MM-dd}.%i",context);
        //String fp = OptionHelper.substVars("E:/" + split[0] + "/"+ getSysYear() + "/" + getSysMonth() + "/" + split[1] + "_" + split[2] +"_"+ ".%d{yyyy-MM-dd}.%i",context);  
        if(count == 3) {
            //fp = OptionHelper.substVars("E:/" + split[0] + "/"+ getSysYear() + "/" + getSysMonth() + "/" + split[1] + "_" + split[2] + "_" + "_agora" + ".%d{yyyy-MM-dd}.%i",context);
            fp = OptionHelper.substVars("/U01/apps/tomcat-statusServer/statusServer_logs/" + split[0] + "/"+ getSysYear() + "/" + getSysMonth() + "/" + split[1] + "_" + split[2] + "_" + "_agora" + ".%d{yyyy-MM-dd}.%i",context);
        }
        policy.setMaxFileSize(FileSize.valueOf("128MB"));  
        policy.setFileNamePattern(fp);  
        policy.setMaxHistory(15);  
        policy.setTotalSizeCap(FileSize.valueOf("32GB"));  
        policy.setParent(appender);  
        policy.setContext(context);  
        policy.start();  

        PatternLayoutEncoder encoder = new PatternLayoutEncoder();  
        encoder.setContext(context);  
        encoder.setPattern("%d{yyyy-MM-dd/HH:mm:ss.SSS}|%X{localIp}|[%t] %-5level %logger{50} %line - %n%m%n");  
        encoder.start();  

        appender.setRollingPolicy(policy);  
        appender.setEncoder(encoder);  
        appender.start();  
        logger.addAppender(appender);  

        return logger;  
    }  

    public static String getSysYear() {
        Calendar date = Calendar.getInstance();
        String year = String.valueOf(date.get(Calendar.YEAR));
        return year;
    }

    public static int getSysMonth() {
        Calendar cal = Calendar.getInstance();
        int month = cal.get(Calendar.MONTH )+1;
        return month;
    }

    public static String getSysYearMonthDay() {
        Date date = new Date();  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
        String dateNowStr = sdf.format(date);  
        return dateNowStr;
    }


}

各位大佬帮忙看一下,谢谢大家了。

1个回答

你想要把logback的日志文件上传到ftp其实是可以的,但是你需要改变下策略,由于logback当前的正在处理的日志文件是处于服务器打开状态,确实不允许别的程序去
操作它,这个时候你可以将日志文件按天存储,然后上传ftp的时候,判断下只上传今天之前的日志文件就可以了,忘采纳!

liuxinnidongde
IT-JAVA小刘 回复qq_25502529: 那就每天的再切成每100M一个文件的方式就行,上传ftp,上传之前已处理的日志文件就行,上传完同时删除本地的
一年多之前 回复
qq_25502529
吴大宝藏男孩 谢谢回答,不能通过配置关闭吗?因为我有通过重写logback的一些方法实现根据传入的条件实现不同的日志文件打印,如果不能关闭的话,以后用户量变大的情况下,哪怕一天之内也会很占用资源
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
日志打印——logback打印出来的日志无法操作(显示程序被占用)
-
logback打印日志输出到不同文件
-
logback 打印日志自带行号且自带应用IP地址?
-
logback 记录异常日志
-
slf4j logback日志输出至不同的文件中,日志文件名在程序中动态指定
-
LogBack 日志压缩产生上百G的tmp文件问题
-
ibatis执行sql出现异常,logback不输出日志
-
logback 记录异常日志文件
-
logback 记录异常日志到文件
-
普通的web工程配置logback日志用法
-
logback日志数量修改问题
-
logback写入日志的时候,日志文件总是空的
-
springboot+logback每日生成日志文件
-
logback 日志 生成日期目录的有关问题
-
springboot配置好了logback之后,项目启动时只打印logback配置信息,打印完成后项目就停止运行
-
关于logback如何按等级输出到控制台和保存到日志文件
-
logback 独立线程日志的自动压缩清理问题
-
logback 中间有一段时间没有日志输出
-
使用logback 写入日志,部署到linux服务器上后失败问题?
-
记一道字节跳动的算法面试题
点击蓝色“五分钟学算法”关注我哟加个“星标”,天天中午 12:15,一起学算法作者 | 帅地来源公众号 | 苦逼的码农前几天有个朋友去面试字节跳动,面试官问了他一道链表相...
程序员真是太太太太太有趣了!!!
网络上虽然已经有了很多关于程序员的话题,但大部分人对这个群体还是很陌生。我们在谈论程序员的时候,究竟该聊些什么呢?各位程序员大佬们,请让我听到你们的声音!不管你是前端开发...
史上最详细的IDEA优雅整合Maven+SSM框架(详细思路+附带源码)
网上很多整合SSM博客文章并不能让初探ssm的同学思路完全的清晰,可以试着关掉整合教程,摇两下头骨,哈一大口气,就在万事具备的时候,开整,这个时候你可能思路全无 ~中招了咩~ ,还有一些同学依旧在使用eclipse或者Myeclipse开发,我想对这些朋友说IDEA 的编译速度很快,人生苦短,来不及解释了,直接上手idea吧。这篇文章每一步搭建过程都测试过了,应该不会有什么差错。本文章还有个比较优秀的特点,就是idea的使用,基本上关于idea的操作都算是比较详细的,所以不用太担心不会撸idea!最后,本文
吃人的那些 Java 名词:对象、引用、堆、栈
作为一个有着 8 年 Java 编程经验的 IT 老兵,说起来很惭愧,我被 Java 当中的四五个名词一直困扰着:**对象、引用、堆、栈、堆栈**(栈可同堆栈,因此是四个名词,也是五个名词)。每次我看到这几个名词,都隐隐约约觉得自己在被一只无形的大口慢慢地吞噬,只剩下满地的衣服碎屑(为什么不是骨头,因为骨头也好吃)。
LeetCode解题汇总目录
此篇为LeetCode刷题的汇总目录,方便大家查找,一起刷题,一起PK交流! 已解题目 考点 LeetCode 1. 两数之和(哈希) LeetCode 2. 两数相加(单链表反转) LeetCode 9. 回文数 LeetCode 11. 盛最多水的容器(双指针) LeetCode 15. 三数之和 LeetCode 17. 电话号码的字母组合(回溯...
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
不识 Pandas,纵是老手也枉然?
作者 |周志鹏 责编 | 郭 芮 这段时间和一些做数据分析的同学闲聊,我发现数据分析技能入门阶段存在一个普遍性的问题,很多凭着兴趣入坑的同学,都能够很快熟悉Python基础语法,然后不约而同的一头扎进《利用Python进行数据分析》这本经典之中,硬着头皮啃完之后,好像自己什么都会了一点,然而实际操作起来既不知从何操起,又漏洞百出。 至于原因嘛,理解不够,实践不够是两条老牌的拦路...
接班马云的为何是张勇?
上海人、职业经理人、CFO 背景,集齐马云三大不喜欢的张勇怎么就成了阿里接班人? 作者|王琳 本文经授权转载自燃财经(ID:rancaijing) 9月10日,张勇转正了,他由阿里巴巴董事局候任主席正式成为阿里巴巴董事局主席,这也意味着阿里巴巴将正式开启“逍遥子时代”。 从2015年接任CEO开始,张勇已经将阿里巴巴股价拉升了超过200%。但和马云强大的个人光环比,张勇显得尤其...
14 个实用的数据库设计技巧
点击上方“后端技术精选”,选择“置顶公众号”技术文章第一时间送达!作者:echozhjuejin.im/post/5d5b4c6951882569eb570958原始单据...
我在快手认识了 4 位工程师,看到了快速发展的公司和员工如何彼此成就!
作者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 从西二旗地铁站B口出来,步行700多米可以看到一个工业建筑风格的院子。这个独立的院子和后厂村各大互联网公司的高楼林立有些不同。 院子里有7栋6层高的楼,几栋楼之间打通,可以从A栋自由穿行到F栋。这里就是快手总部。这个园区可以容纳6000多名员工,目前40%以上是研发人员。 这些研发人员维护着快手这款日活超过2亿的ap...
让程序员崩溃的瞬间(非程序员勿入)
今天给大家带来点快乐,程序员才能看懂。 来源:https://zhuanlan.zhihu.com/p/47066521 1. 公司实习生找 Bug 2.在调试时,将断点设置在错误的位置 3.当我有一个很棒的调试想法时 4.偶然间看到自己多年前写的代码 5.当我第一次启动我的单元测试时 ...
用Python分析2000款避孕套,得出这些有趣的结论
到现在为止,我们的淘宝教程已经写到了第四篇,前三篇分别是: 第一篇:Python模拟登录淘宝,详细讲解如何使用requests库登录淘宝pc端。 第二篇:淘宝自动登录2.0,新增Cookies序列化,教大家如何将cookies保存起来。 第三篇:Python爬取淘宝商品避孕套,教大家如何爬取淘宝pc端商品信息。 今天,我们来看看淘宝系列的第四篇 我们在上一篇的时候已经将淘宝数据爬取下来了,...
Spring高级技术梳理
Spring高级技术梳理 序言正文SpringDate部分Spring全家桶之SpringData——预科阶段Spring全家桶之SpringData——Spring 整合Hibernate与Hibernate JpaSpring全家桶之SpringData——Spring Data JPASpring全家桶之SpringData——SpringData RedisSpringBoot部分Sp...
如何在Windows中开启"上帝模式"
原文链接 : https://mp.weixin.qq.com/s?__biz=MzIwMjE1MjMyMw==&amp;mid=2650202982&amp;idx=1&amp;sn=2c6c609ce06db1cee81abf2ba797be1b&amp;chksm=8ee1438ab996ca9c2d0cd0f76426e92faa835beef20ae21b537c0867ec2773be...
Docker 零基础从入门到使用
诺!这只可爱的小鲸鱼就是docker了! Docker 是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上( 摘自百度 )。 Docker 能干什么? 在讲 Docker 能干什么之前,我们不妨先看看没有 Docker 和有Docker分别是个什么样子的? 场景一 某公司需要开发...
再见 Docker,是时候拥抱下一代容器工具了
什么是 Linux 容器?Linux 容器是由 Linux 内核所提供的具有特定隔离功能的进程,Linux 容器技术能够让你对应用及其整个运行时环境(包括全部所需文件)一...
不足20行 python 代码,高效实现 k-means 均值聚类算法
关于 k-means 均值聚类算法的原理介绍、实现代码,网上有很多,但运行效率似乎都有点问题。今天稍微有点空闲,写了一个不足20行的 k-means 均值聚类算法,1万个样本平均耗时20毫秒(10次均值)。同样的数据样本,网上流行的算法平均耗时3000毫秒(10次均值)。差距竟然达百倍以上,令我深感意外,不由得再次向 numpy 献上膝盖!
分享靠写代码赚钱的一些门路
作者 mezod,译者 josephchang10如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。今天给大家分享一个精彩...
北漂程序员,扬帆起航的地方
随着耳畔传来“你看这碗又大又圆、你看这面又长又宽......碗大宽无影、像儿时的回忆......”听着挺带劲,于是看了一下手机,原来是吴亦凡的作品《大碗宽面》,随着入耳的旋律,脑子也不由自主的想起 10 年前,在平西府吃 5 块钱一大碗牛肉板面的情景。 平西府最有名的就是这个牌坊啦。记得每当有同事问起住哪里?都会自豪的说住在王府里;隔三差五也会邀请朋友去府上坐坐。其实打内心里讲,平西府是一个...
技术人员要拿百万年薪,必须要经历这9个段位
很多人都问,技术人员如何成长,每个阶段又是怎样的,如何才能走出当前的迷茫,实现自我的突破。所以我结合我自己10多年的从业经验,总结了技术人员成长的9个段位,希望对大家的职...
多线程编程是后台开发人员的基本功
这里先给大家分享一个小故事:在我刚开始参加工作的那年,公司安排我开发一款即时通讯软件(IM,类似于 QQ 聊天软件),在这之前我心里也知道如果多线程操作一个整型值是要加锁...
相关热词 c#二进制字符转字节 c# rc4 c#中md5加密 c# 新建mvc项目 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字