- 浏览: 3449206 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
就像DCMTK官方论坛说的那个问题一样:问题:自定义Appender输出DCMTK的oflog
DCMTK日志输出类
大家都知道:DCMTK只提供下面四个日志输出类。
FileAppender: Appends log events to a file.(将DCMTK日志输出到一个文件中)
ConsoleAppender:ConsoleAppender appends log events to STD_NAMESPACE cout
or STD_NAMESPACE cerr
using a layout specified by the user.(将DCMTK日志输出到控制台cmd)
log4cplus::NullAppender:Appends log events to ......(不输出,空的)
SocketAppender:Sends spi::InternalLoggingEvent objects to a remote a log server.(将该日志事件发送给远程服务器)
因为我需要在自己的Qt Gui项目中也输出DCMTK日志,供系统测试或者通过我项目的日志模块登记到数据库、文件中。总之我需要把DCMTK的日志模块集成到自己的Gui项目中。于是我自定义了一个GuiAppender类。
GuiAppender:
实现将DCMTK日志事件捕获,并将日志输出在VS2008的Debug窗口中,也可以后期供调用。
实现源码
我的GuiAppender类 源码
#ifndef GUIAPPENDER_H #define GUIAPPENDER_H #include "dcmtk/oflog/config.h" #include "dcmtk/oflog/appender.h" #include "dcmtk/oflog/helpers/property.h" #include <sstream> namespace log4cplus { class GuiAppender : public Appender { public: GuiAppender(); GuiAppender(const log4cplus::helpers::Properties& properties, log4cplus::tstring& error); virtual ~GuiAppender(); // Methods virtual void close(); protected: virtual void append(const log4cplus::spi::InternalLoggingEvent& event); //声明一个ostringsteam对象 STD_NAMESPACE ostringstream outString ; private: // Disallow copying of instances of this class GuiAppender(const GuiAppender&); GuiAppender& operator=(const GuiAppender&); }; } // end namespace log4cplus #endif // GUIAPPENDER_H
#include "GuiAppender.h" #include <string> #include <QDebug> #include <QString> log4cplus::GuiAppender::GuiAppender() { } log4cplus::GuiAppender::GuiAppender(const log4cplus::helpers::Properties& properties, tstring&) : Appender(properties) { } log4cplus::GuiAppender::~GuiAppender() { } void log4cplus::GuiAppender::close() { } // This method does not need to be locked since it is called by // doAppend() which performs the locking void log4cplus::GuiAppender::append(const spi::InternalLoggingEvent& event) { //格式化输入DCMTK日志 layout->formatAndAppend(outString, event); //获取DCMTK日志字符串流 STD_NAMESPACE string m = outString.str(); //将C++标准字符串流,转换成QString QString t = QString::fromStdString(m); //输出调试信息 qDebug() << t; //清空 outString.str(""); }
主程序测试。
/* * * Copyright (C) 2011-2012, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by * * OFFIS e.V. * R&D Division Health * Escherweg 2 * D-26121 Oldenburg, Germany * * * Module: dcmnet * * Author: Michael Onken * * Purpose: Test for move feature of the DcmSCU class */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmnet/diutil.h" #include "DcmTestSCU.h" #include <QtGui/QApplication> #include <QDebug> #include "dcmtk/oflog/oflog.h" #include "GuiAppender.h" #define OFFIS_CONSOLE_APPLICATION "testscu" static OFLogger echoscuLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // our application entity title used for calling the peer machine #define APPLICATIONTITLE "TEST-SCU" // host name of the peer machine "www.dicomserver.co.uk" #define PEERHOSTNAME "10.3.2.84" // TCP/IP port to connect to the peer machine "11112" #define PEERPORT 5104 // application entity title of the peer machine #define PEERAPPLICATIONTITLE "MOVESCP" // MOVE destination AE Title #define MOVEAPPLICATIONTITLE "TEST-SCU" #define QRResponse FINDResponse static Uint8 findUncompressedPC(const OFString& sopClass, DcmSCU& scu) { Uint8 pc; pc = scu.findPresentationContextID(sopClass, UID_LittleEndianExplicitTransferSyntax); if (pc == 0) pc = scu.findPresentationContextID(sopClass, UID_BigEndianExplicitTransferSyntax); if (pc == 0) pc = scu.findPresentationContextID(sopClass, UID_LittleEndianImplicitTransferSyntax); return pc; } // ******************************************** int main(int argc, char *argv[]) { QApplication a(argc, argv); /* Setup DICOM connection parameters */ OFLog::configure(OFLogger::DEBUG_LOG_LEVEL); OFLOG_DEBUG(echoscuLogger, "OFLOG_DEBUG"); /* specify log pattern */ OFauto_ptr<log4cplus::Layout> layout(new log4cplus::PatternLayout("%D{%Y-%m-%d %H:%M:%S.%q} %5p: %m%n")); //建立Gui日志输出类 log4cplus::SharedAppenderPtr guiAppender(new log4cplus::GuiAppender()); guiAppender->setLayout(layout); //获取全局日志对象 log4cplus::Logger log = log4cplus::Logger::getRoot(); //去除所有日志输出类 log.removeAllAppenders(); //加入Gui输出类 log.addAppender(guiAppender); //设置日志输出层 log.setLogLevel(OFLogger::INFO_LOG_LEVEL); //测试输出一个error日志 OFLOG_ERROR(log, "There are six log levels and each provides a OFLOG_level() macro"); //继续测试,输出DCMTK C-Echo动作产生的INFO //后面是DCMTK的DcmNet模块中 网络通信的测试,大家不需要了解 DcmTestSCU scu; // set AE titles scu.setAETitle(APPLICATIONTITLE); scu.setPeerHostName(PEERHOSTNAME); scu.setPeerPort(PEERPORT); scu.setPeerAETitle(PEERAPPLICATIONTITLE); // Use presentation context for FIND/MOVE in study root, propose all uncompressed transfer syntaxes OFList<OFString> ts; ts.push_back(UID_LittleEndianExplicitTransferSyntax); ts.push_back(UID_BigEndianExplicitTransferSyntax); ts.push_back(UID_LittleEndianImplicitTransferSyntax); scu.addPresentationContext(UID_FINDStudyRootQueryRetrieveInformationModel, ts); scu.addPresentationContext(UID_MOVEStudyRootQueryRetrieveInformationModel, ts); scu.addPresentationContext(UID_VerificationSOPClass, ts); /* Initialize network */ OFCondition result = scu.initNetwork(); if (result.bad()) { DCMNET_ERROR("Unable to set up the network: " << result.text()); return 1; } /* Negotiate Association */ result = scu.negotiateAssociation(); if (result.bad()) { DCMNET_ERROR("Unable to negotiate association: " << result.text()); return 1; } /* Let's look whether the server is listening: Assemble and send C-ECHO request */ result = scu.sendECHORequest(0); if (result.bad()) { DCMNET_ERROR("Could not process C-ECHO with the server: " << result.text()); return 1; } scu.closeAssociation(DCMSCU_RELEASE_ASSOCIATION); return a.exec(); }
实现结果
最终结果,将DCMTK日志输出到VS2008的Debug窗口中。
------------------------------------
柳北风儿
http://qimo601.iteye.com
------------------------------------
发表评论
-
DCMTK: DcmSCP, error:QueryRetrieveLevel larger remaining bytes
2012-11-06 09:48 3020最近在DcmSCU发送一个findRequest后,DcmSC ... -
DICOM标准(2011)
2012-10-22 10:31 2983DICOM标准(2011) 最新版,下载请看我的百度云网 ... -
DCMTK:wwwapp instalation
2012-10-18 15:55 3319问题 最近按照wwwapp.txt安装work ... -
workList in DCMTK问题总结
2012-10-17 19:37 3583最近正在配置DCMTK中的worklist,因为需要响应C-F ... -
web Server支持 perl
2012-10-17 10:06 3402最近使用DCMTK 安装worklist 需要用到webser ... -
DICOM C-GET vs C-MOVE
2012-10-08 17:01 6626DICOM中C-Get 和C-Move的区别。 C-Move ... -
【最新snapshot】DCMTK3.6.1(MD支持库)安装说明
2012-09-25 16:16 7441【前言】 最近,因为需要开发DICOM ... -
问题:自定义Appender输出DCMTK的oflog
2012-09-24 10:09 2836在我调试DCMTK的DcmNet过程中,发现在Oflog中,D ... -
DCMTK:Receiving Images from PACS using DCMSCU
2012-09-15 14:03 5182通过DCMTK的DCMSCU,从PACS获取图像,看看人 ... -
DCMTK: Set output directory to DcmSCP
2012-09-18 09:16 4559Author Message -
DCMTK:DCMSCU get series
2012-09-15 14:02 2783Author Message mano ... -
DCMTK DCMSCU例子
2012-09-15 14:01 5796转载:http://forum.dcmtk.org/viewt ... -
DCMTK DCMScu和DCMScp 细节讨论
2012-09-15 14:04 14434PACS connection Moderator: ... -
DCMTK Howto: User Identity Negotiation
2012-09-18 09:16 6182Howto: User Identity Negotia ... -
DCMTK:howto:dcmscu-example 网络客户端
2012-09-15 14:00 4350DcmSCU example program Th ... -
DCMTK Create a Mammography CAD SR Document
2012-09-18 09:17 2787Howto: Create a Mammography ... -
DCMTK create GSPS object with multiple image references
2012-09-18 09:17 3014Howto: Create GSPS object wi ... -
DCMTK提取Overlay Data
2012-09-14 14:07 4259Howto: Extract Overlay Data ... -
DCMTK获取压缩后的pixel data
2012-09-14 14:06 6451Howto: Accessing Compressed ... -
DCMTK读取多帧图像,不需要全部读取像素数据,即可处理数据
2012-09-14 14:06 5669Howto: Access multi-frame im ...
相关推荐
2. **继承自抽象类AppenderSkeleton**:自定义Appender需要继承自Log4net的`AppenderSkeleton`类,这个基类已经为我们提供了一些基本功能,如初始化、关闭、过滤和日志事件处理。 3. **覆盖必要方法**: - `Append...
当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先,让我们深入理解如何自定义日志文件名。默认情况下,Log4j的日志文件名通常是固定的或者基于时间戳生成...
"logjs" 是一个专为前端设计的日志工具库,它的主要功能是提供简单易用的API,让开发者可以方便地根据需要配置日志级别(level)和输出方式(appender),以便于调试和监控应用状态。 首先,让我们深入了解一下**...
然而,这些可能无法满足所有特定场景的需求,因此我们可以通过创建自定义Appender来实现更个性化的日志处理。 要创建自定义Appender,我们需要遵循以下步骤: 1. **定义Appender类**:首先,创建一个继承自`org....
标题中的“扩展logback将日志输出到Kafka实例扩展源码”指的是在Java应用程序中,使用logback作为日志框架,并通过自定义appender(输出模块)将日志信息发送到Apache Kafka的消息队列中。Logback是SLF4J(Simple ...
要实现输出多个自定义路径的日志文件,我们需要在Log4j的配置文件(通常是`log4j.properties`或`log4j.xml`)中定义多个Appender。Appender是Log4j中负责将日志信息输出到指定目的地的组件,例如文件、控制台、网络...
在Log4j中,Appender是负责将日志信息输出到特定目的地的组件,如控制台、文件、网络、数据库等。通过配置多个Appender,我们可以让日志信息分散存储,便于管理和分析。 要实现按接口生成各自日志文件的目标,我们...
Java自定义日志工具类是Java开发中一个重要的实践,它可以帮助开发者记录应用程序运行过程中的信息,便于调试、排查问题和后期分析。日志工具类通常包含多种级别(如DEBUG, INFO, WARN, ERROR, FATAL)以适应不同...
要创建多个自定义日志文件,你需要定义多个`Appender`,并为每个`Appender`指定不同的日志级别、输出格式和输出路径。 以下是一个基础的Log4j配置示例,它将日志同时输出到控制台和名为`test.log`的文件: ```...
4. **可定制日志格式**:Logback支持自定义日志格式,这意味着你可以根据需求调整日志输出的样式,包括时间戳、级别、线程名、类名、消息等内容,以满足不同的分析和展示需求。 在“logback-websocket”这个压缩包...
PatternLayout允许你自定义输出格式,如日期、线程ID、日志级别等。 ```cpp LayoutPtr layout(new PatternLayout("%d{ISO8601} - %p - %c - %m%n")); // 例如,按照ISO8601时间格式、级别、logger名、消息输出 ...
自定义Appender允许开发者根据特定需求定制日志输出的方式,例如发送邮件、写入特殊格式的文件或者将日志推送到远程服务器。 以下是使用logback+slf4j自定义Appender的详细步骤: 1. **创建Appender类**:首先,你...
`Log4j`是一个广泛使用的Java日志框架,它提供了灵活的日志配置和多种Appender(日志输出器),使得开发者可以方便地控制日志的输出。标题提到的是一个针对`Log4j`的扩展,名为`DayRollingFileAppender`,它是一个按...
4. 定义日志输出格式:通过配置log4j.appender.CATALINA.layout为org.apache.log4j.PatternLayout,可以定义日志的格式。例如,可以设置为%d{yyyy-MM-ddHH:mm:ss.SSS}%p[%t]%c|%m%n来让日志格式和Log4j保持一致。 5...
Logger负责生成日志事件,Appender决定这些事件如何被输出(例如,写入文件、发送邮件或显示在控制台),而Layout则决定了日志事件的具体格式。 在Log4j的配置文件中,通常使用.properties或.xml格式。在这个例子中...
2. **配置Logback**:创建一个名为`logback.xml`的配置文件,定义一个Appender(输出器)来指定Kafka作为日志的目标。你需要配置Kafka的topic、服务器地址(bootstrap.servers)以及其它相关参数,例如序列化器...
在"log4j输出日志到flume"的例子中,我们需要在Log4j配置文件中设置一个自定义的Appender(输出端),这个Appender将会把日志发送到Flume。一个基本的配置示例如下: ```properties # Log4j配置示例 log4j.root...
1. **创建自定义Appender**:你需要继承Log4j的AppenderSkeleton类,并实现其必要的方法,如`append()`。在这个方法中,你可以获取到日志事件(LoggingEvent),并从中提取出日志信息。 2. **设置Layout**:根据...
在代码中,可以创建一个自定义的类(如`LogInfo`),包含这些字段,然后在日志事件发生时,实例化这个类并填充相关信息。这样,日志信息不仅包含默认的日志级别(如DEBUG、INFO、WARN、ERROR、FATAL),还能包含项目...
如果你需要自定义日志的输出方式或格式,可以继承`log4cplus::Appender`和`log4cplus::Layout`类,实现自己的功能。例如,你可以创建一个将日志发送到邮件的Appender,或者创建一个格式化的Layout,使日志更易读。 ...