我造了一个轮子去写系统日志

本文介绍了一种使用Java实现的日志异步写入方案,通过Executors和BlockingQueue技术,确保操作日志不影响应用性能,实现了高效、低延迟的日志记录。

微信公众号:Java患者
专注Java领域技术分享

前言

在我们工作的项目中,每个项目都会涉及到操作日志,每个公司当然也有自己的想法自己做操作日志的保存。我今天造了一个简单的轮子来写日志。采用的技术是ExecutorsBlockingQueue

Executors


一个线程池接口,定义了一个可以接收Runnable对象的方法executor,该方法接收要给Runnable实例后,可以用来执行一个任务,一般使用execute(new RunnableTask())方法异步执行。

为什么要开另外一个线程?

为什么要异步执行?因为这里考虑到操作日志不应该影响到我们的性能,我们在操作之后,无需等到日志写完才response。

BlockingQueue

Blocking 即为阻塞,Queue即为队列,BlockingQueue阻塞队列类。

其实就是一个队列的数据结构,线程一直以队列的数据结构从BlockingQueue里面拿数据,如果没数据了,那么线程就一直阻塞进入等待状态,一直等一直等,直到有其他线程在BlockingQueue中添加了数据,被阻塞的线程被唤醒。同样,如果BlockingQueue是满的,有线程从队列中存放数据,线程也会被阻塞,一直等一直等,等到不满的时候,线程唤醒,继续存放数据。

实例

操作内容

package com.zero.na;

import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class WriteLogUtil {

    private ExecutorService executorService;
    private BlockingQueue<Map<String, String>> bqBuff;

    public WriteLogUtil() {
        executorService = Executors.newSingleThreadExecutor();
        bqBuff = new ArrayBlockingQueue<>(1024);

        executorService.execute(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    Map<String, String> item = null;
                    try {
                        item = bqBuff.take();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (item != null) {
                        write(item);
                    }

                }
            }
        });
    }

    private final static WriteLogUtil instance = new WriteLogUtil();

    public static WriteLogUtil getInstance() {
        return instance;
    }

    public void appLog(Map<String, String> log) {
        saveLog(log);
    }

    private void saveLog(Map<String, String> log) {
        bqBuff.add(log);
    }

    private void write(Map<String, String> item) {
        System.out.println(item);
    }
}

测试1

package com.zero.na;

import java.util.HashMap;
import java.util.Map;

public class Test1 {

    public static void main(String[] args) {
        WriteLogUtil instance = WriteLogUtil.getInstance();
        Map<String, String> map = new HashMap<>();
        map.put("name", "zero");
        map.put("detail", "第一个客户支付了十块钱");

        instance.appLog(map);

    }
}

测试2

package com.zero.na;

import java.util.HashMap;
import java.util.Map;

public class Test2 {

    public static void main(String[] args) {
        WriteLogUtil instance = WriteLogUtil.getInstance();
        Map<String, String> map = new HashMap<>();
        map.put("name", "zero");
        map.put("detail", "第二个客户支付了二十块钱");

        instance.appLog(map);

    }
}



我们可以看到这个线程永远都不会停止,因为我们会有一个线程一直在while(true),一直在执行,永远都在等待。这个时候我们的用例写好了。这个时候我们的日志可以选择写在MongoDB数据库中。

这个我们下篇讲。。。。。。

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

本指南详细阐述基于Python编程语言结合OpenCV计算机视觉库构建实时眼部状态分析系统的技术流程。该系统能够准确识别眼部区域,并对眨眼动作与持续闭眼状态进行判别。OpenCV作为功能强大的图像处理工具库,配合Python简洁的语法特性与丰富的第三方模块支持,为开发此类视觉应用提供了理想环境。 在环境配置阶段,除基础Python运行环境外,还需安装OpenCV核心模块与dlib机器学习库。dlib库内置的HOG(方向梯度直方图)特征检测算法在面部特征定位方面表现卓越。 技术实现包含以下关键环节: - 面部区域检测:采用预训练的Haar级联分类器或HOG特征检测器完成初始人脸定位,为后续眼部分析建立基础坐标系 - 眼部精确定位:基于已识别的人脸区域,运用dlib提供的面部特征点预测模型准确标定双眼位置坐标 - 眼睑轮廓分析:通过OpenCV的轮廓提取算法精确勾勒眼睑边缘形态,为状态判别提供几何特征依据 - 眨眼动作识别:通过连续帧序列分析眼睑开合度变化,建立动态阈值模型判断瞬时闭合动作 - 持续闭眼检测:设定更严格的状态持续时间与闭合程度双重标准,准确识别长时间闭眼行为 - 实时处理架构:构建视频流处理管线,通过帧捕获、特征分析、状态判断的循环流程实现实时监控 完整的技术文档应包含模块化代码实现、依赖库安装指引、参数调优指南及常见问题解决方案。示例代码需具备完整的错误处理机制与性能优化建议,涵盖图像预处理、光照补偿等实际应用中的关键技术点。 掌握该技术体系不仅有助于深入理解计算机视觉原理,更为疲劳驾驶预警、医疗监护等实际应用场景提供了可靠的技术基础。后续优化方向可包括多模态特征融合、深度学习模型集成等进阶研究领域。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>嗯,用户让我介绍如何一个体现思考的优快云账号。首先,我需要理解用户的需求。可能他们是想在优快云上建立一个技术博客,但希望内容不仅仅是代码分享,而是能展示自己的思考过程,比如解决问题的方法、学习心得或者技术深度分析。这样的话,账号会更有个性,吸引更多读者。 接下来,我得考虑优快云的主要用户群体。优快云是中国最大的IT技术社区,用户大多是开发者、学生和技术爱好者。因此,内容需要兼顾专业性和易懂性。用户可能希望自己的账号既能展示技术实力,又能帮助他人,同时提升个人品牌。 然后,思考如何“体现思考”。这可能包括记录学习过程、解决问题的思路、错误调试的经历,或者对新技术的研究分析。用户需要具体的建议,比如文章结构、内容方向,甚至如何与读者互动。 还要考虑用户可能的深层需求。他们可能不只是想博客,而是想建立个人品牌,或者找工作、接项目。因此,账号的专业度和深度很重要。需要建议他们保持一致性,比如固定的板块、定期更新,以及如何优化SEO,增加曝光。 另外,需要注意避免泛泛而谈,要具体。比如,可以举例说明如何分解问题,如何记录调试过程,或者如何结合理论与实践。同时,提醒用户保持互动,回复评论,参与社区讨论,增加账号活跃度。 最后,检查是否有遗漏的点。比如,是否需要提到使用Markdown、代码片段、图表等来提升文章可读性?或者是否需要讨论如何选择热门技术话题与个人兴趣结合?这些都可能帮助用户更好地规划内容。 总结下来,回答需要结构清晰,分点说明,涵盖定位、内容方向、作技巧、互动维护等方面,并给出具体例子,让用户有实际操作的参考。</think>创建一个体现深度思考的优快云技术账号,需要兼顾专业性、个人风格与读者价值。以下是关键设计方向和示例框架: --- ### **1. 账号定位:打个人技术IP** - **核心领域**:明确细分方向(如「AI工程化」「前端性能优化」「分布式系统踩坑录」) - **人设标签**:思考型开发者 ≠ 搬运工,例如: - 「从Kaggle竞赛到工业落地的模型调优手记」 - 「十年后端老兵的架构反思日志」 - **视觉符号**:统一封面设计/代码配色/手绘技术图解风格 --- ### **2. 内容设计:展现思维过程** #### ▶ **技术深挖类** - **标题示例**: 《Redis分布式锁:我为什么最终放弃了Redlock算法?》 《TensorFlow动态Shape优化:三天Debug重构实录》 - **内容结构**: 问题场景 → 直觉方案 → 失败原因 → 思维转折点 → 最终方案对比 → 延伸思考 #### ▶ **学习路径类** - **标题示例**: 《自学Rust三个月:从语法到恐惧管理的认知迭代》 《系统调优书单:为何我建议先读<性能之巅>再碰源码?》 - **内容亮点:** 知识地图绘制 + 关键卡点心理记录 + 反常识结论(附实验数据) #### ▶ **行业洞察类** - **标题示例**: 《大模型时代:为什么说Prompt工程将重定义软件测试?》 《从K8s弃用Docker看云原生演进的暗线逻辑》 - **作技巧**: 技术趋势交叉分析(附Gartner曲线改图) + 对工程师的实质影响 -- ### **3. 增强记忆点的技巧** - **系列专栏化**: 《重构启示录》系列(每期解剖一个祖传代码改案例) 《源码迷踪》系列(结合UML时序图追踪框架设计思想) - **互动创新**: 文末抛出开放技术选择题(如方案A/B优劣投票) 定期发布「读者问题诊断室」专题 - **多模态表达**: 复杂逻辑配自制动图解说 关键结论用Latex公式强化呈现 --- ### **4. 运营策略** - **更新节奏**:双周更深度长文 + 每周碎片化思考(用「技术札记」标签分类) - **流量撬动**: 参与优快云「开发者生态研究」等专栏征稿 关键文章同步至GitHub的README(导流到个人项目) - **数据闭环**: 在文末添加「知识溯源」板块(附相关论文/工具链/Git commit记录) --- ### **示例账号结构** ```markdown 【账号ID】TechThinker算法手札 📜 置顶文章: 《我的技术作原则:不重复轮子指南》 《2024年技术关注清单:五个被低估的研究方向》 🗂 专栏分类: ▷ 机器学习反模式研究(12篇) ▷ 读源码的艺术(7篇) ▷ 高效能开发者的工具哲学(9篇) 🌟 爆款案例: 《放弃Python转Go:我们团队在AI基础设施上的教训》 - 阅读15w+,引发语言战争讨论 《记一次失败的微服务改:从充血到贫血架构的退化》 - 被多个公司内部分享引用 ``` --- 通过持续输出「有技术增量+认知差异性」的内容,此类账号可实现: ✅ 建立行业影响力 ✅ 吸引高质量人脉(猎头/技术合伙人邀约) ✅ 反向促进自身技术体系化 关键要诀:**把作当作深度学习的催化剂**,让思考可见化形成复利效应。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值