Java 记录器控制台流重复输出

2023-12-31

我希望这个问题有一个简单的答案。我正在尝试将记录器添加到我的 Java 应用程序中。我能够完美地格式化日志文件,但在尝试将 ConsoleHandler 添加到记录器以格式化控制台输出时遇到了问题。

添加 ConsoleHandler 后,每条日志消息都不会打印三次,两次使用我想要的正确格式,然后一次使用我不想要的原始格式。

我将在下面发布我的代码,完全不确定我做错了什么。
任何帮助将不胜感激。

// remove and handlers that will be replaced
Handler[] handlers = logger.getHandlers();
for(Handler handler : handlers)
{
    if(handler.getClass() == ConsoleHandler.class || handler.getClass() == FileHandler.class)
        logger.removeHandler(handler);
}

// file handler
FileHandler fh = new FileHandler(file.toString());
fh.setFormatter(new MS2Formatter());
logger.addHandler(fh);

// console handler
ConsoleHandler ch = new ConsoleHandler();
ch.setFormatter(new MS2Formatter());
logger.addHandler(ch);

logger.setLevel(Level.INFO);

EDIT: Answer

只是想在这里发布我的最终代码来帮助任何遇到类似问题的人。

logger = Logger.getLogger("My Logger");     
logger.setUseParentHandlers(false);

// remove and handlers that will be replaced
Handler[] handlers = logger.getHandlers();
for(Handler handler : handlers)
{
        if(handler.getClass() == ConsoleHandler.class)
            logger.removeHandler(handler);
}

// setup the file
File file = new File(location + "/" + fileName);

// file handler
FileHandler fh = new FileHandler(file.toString(), true);
fh.setFormatter(new MS2Formatter());
logger.addHandler(fh);

// console handler
ConsoleHandler ch = new ConsoleHandler();
ch.setFormatter(new MS2Formatter());
logger.addHandler(ch);

// remove and handlers that will be replaced
logger.setLevel(Level.INFO);

您到底需要多少个处理程序?addHandler()将您创建的处理程序添加到与该记录器关联的处理程序中。因此,您拥有默认处理程序,以及您在代码中添加的 2 个处理程序 - FileHandler 和 ConsoleHandler。

您可以使用以下命令获取当前的处理程序集getHandlers()方法及用途removeHandler()删除不需要的处理程序。

EDIT

在您的情况下,很可能正在使用父处理程序。因此,即使您认为要删除处理程序,如果您实际调试代码,您也会发现在 for 循环执行期间您根本没有真正删除处理程序(或者至少不是 ConsoleHandler)。

要防止使用父处理程序,请使用此语句。

logger.setUseParentHandlers(false);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 记录器控制台流重复输出 的相关文章

  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 如何在 iOS 中创建多行字符串或多行标签作为 CGPath?

    API支持这个吗 如果没有 我该怎么办 有CTFontCreatePathForGlyph在 Core Text 中 它可以将单个字符转换为路径 我可以在循环中使用它来创建我的字符串作为路径 但我必须处理间距和字偶距以及所有其他令人讨厌的事
  • 调用 didRangeBeacon 时未找到任何信标

    我注册了自己的位置管理器来监视和测距一些信标 self locationManager startMonitoringForRegion region self locationManager startRangingBeaconsInRe
  • 如何让android应用程序始终保持登录状态?

    现在我正在尝试创建一个 Android 应用程序 假设它将是某种 X 概念 所以我正在创建一个登录屏幕 我想做的是 如果我在手机上登录该应用程序 那么每当我尝试访问该应用程序时 它应该始终登录 例如我们手机中的 Facebook G mai
  • 返回前正确,返回后错误

    我已经在谷歌上搜索了几个小时 但没有运气 我正在使用标准c 调用一个非常简单的方法 并返回正确的值 但返回后的值完全错误 call declare the gross and ficaTax variables double gross d
  • 未生成资源文件代码

    我有我的默认资源文件Resources resxVisual Studio 很好地生成了一个designer cs类 但是当我尝试创建Resources de DE resx 它不会生成 我检查了两个文件的所有属性是否相同 它确实生成Res
  • 在 Macintosh 上安装 OpenCV

    我一直在关注这个教程 http blogs wcode org 2014 10 howto install build and use opencv macosx 10 10 http blogs wcode org 2014 10 how
  • PHP 服务器返回的 JSON 数据为空

    我很难弄清楚这个问题 似乎无论我尝试什么 PHP 总是最终返回一个空数组 这是我的主文件 index php 的代码
  • 从 Web 应用程序打印到客户端打印机

    如果我有一台打印机直接连接到 PC 带有打印机的信息亭 我将如何创建网页 net Web 应用程序 将 jpg 打印到信息亭打印机的功能 而无需用户干预 除了单击页面上的按钮 这个问题已经被问过好几次了 结果总是你can t通过普通的网络技
  • Ionic 2 / 3 / 4:如何将标题中的按钮与标题右侧对齐

    如何与右侧对齐 按钮显示在标题左侧 没有撰写图标 这是我正在做的事情
  • Nginx 位置匹配中的变量捕获

    假设我有一个像这样的 URL www example com a b sth 我在 Nginx 配置中编写了一个位置块 location a b
  • C# 中的 3D 数学有什么好的库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一个工具 它将用于处理一堆 3D 数据 执行诸如旋转对象 平移 缩放和所有这些好东西之类的操
  • 如何向用户询问文件名?

    搜索 FileDialog 的调用 我想向用户询问 Pharo 4 0 中的文件名 通过观察员我找到了班级 FileDialogWindow 用一种方法 answerFileName 寻找 answerFileName 的发件人 我去上课
  • Google Maps API:缩放时 SVG 标记相对于地图移动

    我在地图上创建了两个标记 一个是标准标记 另一个使用 SVG 路径 当我缩小时 标准标记不会相对于地图移动 但 SVG 标记会相对移动 这是一个小提琴 你可以明白我的意思 http jsfiddle net 9A4ET http jsfid
  • 如何使用 Spray Routing 测试自定义 Json 对象

    我正在 mongodb 之上创建一个带有 Spray routing 的 Rest API 以进行一些 CRUD 操作 这一切都工作正常 预计每当我尝试使用 specs2 测试它时 以下规格 class RestServiceSpec ex
  • 使用 MapView 抛出 ClassNotFoundException

    我正在努力寻找这段代码锁定的原因 据我所知 我在清单文件中声明了正确的权限 如下所示 我尝试在实际设备 Droid x w 2 3 3 和 AVD 上运行它 但没有成功 我还附加了 logcat 这使我遇到了 classnotfound 异
  • 如何验证x509证书的签名?

    我有两个 X509Certificate 对象 x1 和 x2 我想验证 x2 是否由 x1 签名 我认为这是通过 x1 的公钥和 x2 的签名来完成的 具体如何做到这一点 我还想知道将 x2 的发行者与 x1 的主题进行逐字节比较并在不同
  • 使用node js按名称过滤

    有什么方法可以过滤具有给定扩展名的文件 然后进一步过滤它们 例如 我有 txt扩展 我想得到我所有的 txt来自数组 file animal bio txt xray pdf fish bio txt mammal doc txt huma
  • PHP DateTime::createFromFormat 不起作用

    DateTime createFromFormat似乎无法正常工作 有谁知道原因和 或如何修复它 鉴于此代码 var dump DateTime createFromFormat m 02 gt format m var dump Date
  • 我什么时候可以安全地使用 HTML5 中的新
    元素?

    12 月 16 日 HTML5 扩展规范
  • Java 记录器控制台流重复输出

    我希望这个问题有一个简单的答案 我正在尝试将记录器添加到我的 Java 应用程序中 我能够完美地格式化日志文件 但在尝试将 ConsoleHandler 添加到记录器以格式化控制台输出时遇到了问题 添加 ConsoleHandler 后 每