日志信息的编写与调用

StdLogger.h

 

#ifndef STDLOGGER_H
#define STDLOGGER_H
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/fileappender.h>


class StdLogger
{
public:
StdLogger();
virtual ~StdLogger();

/// 启动日志系统
/// @param[in] properties_filename 日志系统配置文件文件名
void StartSystem();

/// 关闭日志系统
void StopSystem();

public:
void Debug(const char* pFormat, ...);

void Error(const char* pFormat, ...);

void Fatal(const char* pFormat, ...);

void Info(const char* pFormat, ...);

void Warn(const char* pFormat, ...);

void Trace(const char* pFormat, ...);

public:
static inline StdLogger* getSingletonPtr()
{
return &getSingleton();
}
static inline StdLogger& getSingleton()
{
static StdLogger _instance;
return _instance;
}
};
#define g_Logger StdLogger::getSingleton()
#define g_pLogger StdLogger::getSingleton()


//
// 断言日志
//
#define ASSERT_LOG(expr)\
if ( (expr) ) {;} else g_Logger.Error(__FILE__, __LINE__, #expr);


//
// 以下的宏只有VS2005以及之上的版本可以使用!因为VS2005之下的版本不支持可变参数宏
//
#if defined(_MSC_VER) && _MSC_VER > 1400
#define LOG_DEBUG(...) g_Logger.Debug(__FILE__, __LINE__, __VA_ARGS__);
#define LOG_ERROR(...) g_Logger.Error(__FILE__, __LINE__, __VA_ARGS__);
#define LOG_FATAL(...) g_Logger.Fatal(__FILE__, __LINE__, __VA_ARGS__);
#define LOG_INFO(...) g_Logger.Info(__FILE__, __LINE__, __VA_ARGS__);
#define LOG_WARN(...) g_Logger.Warn(__FILE__, __LINE__, __VA_ARGS__);
#define LOG_TRACE(...) g_Logger.Trace(__FILE__, __LINE__, __VA_ARGS__);
#endif


#endif

 

 

实现:


#include "StdLogger.h"
#include <cstdlib>
#include <iostream>
#include <log4cplus/config.hxx>
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/stringhelper.h>
#include <log4cplus/helpers/socket.h>
#include <log4cplus/helpers/threads.h>
#include <log4cplus/spi/loggerimpl.h>
#include <log4cplus/spi/loggingevent.h>
#include <log4cplus/fileappender.h>


using namespace log4cplus;
using namespace log4cplus::helpers;

StdLogger::StdLogger()
{

}

StdLogger::~StdLogger()
{
log4cplus::Logger _logger = log4cplus::Logger::getRoot();
LOG4CPLUS_INFO(_logger, "Logger System Stop Finish.");
}

#define DO_LOGGER(logLevel,pFormat, bufSize)\
log4cplus::Logger _logger = log4cplus::Logger::getRoot();\
\
if(_logger.isEnabledFor(logLevel))\
{ \
va_list args; \
va_start(args, pFormat); \
char buf[bufSize] = {0}; \
_vsnprintf(buf, sizeof(buf), pFormat, args); \
va_end(args); \
_logger.forcedLog(logLevel, buf); \
}

void StdLogger::Debug( const char* pFormat, ...)
{
DO_LOGGER(log4cplus::DEBUG_LOG_LEVEL,pFormat, 1024);
}

void StdLogger::Error( const char* pFormat, ...)
{
DO_LOGGER(log4cplus::ERROR_LOG_LEVEL,pFormat, 256);
}

void StdLogger::Fatal( const char* pFormat, ...)
{
DO_LOGGER(log4cplus::FATAL_LOG_LEVEL,pFormat, 256);
}

void StdLogger::Info(const char* pFormat,...)
{
DO_LOGGER(log4cplus::INFO_LOG_LEVEL,pFormat, 512);
}

void StdLogger::Warn(const char* pFormat, ...)
{
DO_LOGGER(log4cplus::WARN_LOG_LEVEL,pFormat, 256);
}

void StdLogger::Trace(const char* pFormat, ...)
{
DO_LOGGER(log4cplus::TRACE_LOG_LEVEL, pFormat, 1024);
}

void StdLogger::StartSystem( )
{
SharedAppenderPtr _append (new ConsoleAppender());

_append->setName("screen_test");

std::string pattern = "%d{%m/%d/%y %H:%M:%S} - %m %n";
std::string pattern2 = "%d{%m/%d/%y %H:%M:%S} - %m [%l]%n";
std::auto_ptr<Layout> _layout(new PatternLayout(pattern));
std::auto_ptr<Layout> layout1(new PatternLayout(pattern2));
std::auto_ptr<Layout> layout2(new PatternLayout(pattern));
_append->setLayout( _layout );


SharedAppenderPtr append1(new FileAppender("web_all.log"));
append1->setName("all log test");

SharedAppenderPtr append2(new FileAppender("web_info.log"));
append2->setName("info log test");

append1->setLayout( layout1 );
append2->setLayout( layout2 );

Logger logger1=Logger::getRoot();
Logger logger2 =Logger::getInstance("web");
Logger logger3 = Logger::getInstance("web.subtest");


logger1.addAppender(append1);
//logger1.setLogLevel(INFO_LOG_LEVEL);

logger2.addAppender(append2);
logger1.setLogLevel(ALL_LOG_LEVEL);

logger3.addAppender(_append);
logger3.setLogLevel(INFO_LOG_LEVEL);
}

void StdLogger::StopSystem()
{

}

 

 

 

///调用

 

 

g_Logger.StartSystem();
log4cplus::Logger root_logger = Logger::getRoot();
log4cplus::Logger info_logger= Logger::getInstance("web.subtest");

LOG4CPLUS_INFO(root_logger, "all log Logger Start .");
LOG4CPLUS_INFO(info_logger, "web info Logger Start .");

转载于:https://www.cnblogs.com/rosesmall/archive/2012/05/04/2483115.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,我们可以使用注解来为类、方法、变量等元素添加一些元数据信息。下面是一个简单的日志注解的示例: ```java import java.lang.annotation.*; @Target(ElementType.METHOD) // 该注解只能用于方法 @Retention(RetentionPolicy.RUNTIME) // 该注解在运行时保留 public @interface Log { String value() default ""; // 日志信息 } ``` 通过上述代码,我们定义了一个名为Log的注解,它只能用于方法上,并且在运行时保留。该注解包含一个名为value的属性,用来指定日志信息。 接下来,我们可以在需要打印日志的方法上使用该注解,例如: ```java public class Demo { @Log("执行了方法A") public void methodA() { // 方法A的实现 } } ``` 在上述示例中,我们在方法methodA上使用了Log注解,并指定了日志信息为“执行了方法A”。接下来,我们可以在方法执行前后打印日志: ```java public class LogUtil { public static void log(Method method) { Log log = method.getAnnotation(Log.class); if (log != null) { System.out.println(log.value() + " 开始执行..."); } // 执行方法 try { method.invoke(); } catch (Exception e) { e.printStackTrace(); } if (log != null) { System.out.println(log.value() + " 执行结束..."); } } } ``` 在上述代码中,我们定义了一个名为LogUtil的工具类,其中log方法接受一个Method类型的参数,表示需要打印日志的方法。我们首先通过getAnnotation方法获取该方法上的Log注解,如果存在,则打印日志信息并执行该方法。方法执行完毕后,再次检查Log注解是否存在,如果存在,则打印日志信息表示方法执行结束。 最后,我们可以在调用需要打印日志的方法时,使用LogUtil工具类来实现日志打印: ```java public class Main { public static void main(String[] args) { Demo demo = new Demo(); Method method = Demo.class.getMethod("methodA"); LogUtil.log(method); } } ``` 在上述代码中,我们首先创建了一个Demo对象,然后通过反射获取methodA方法,并将其传入LogUtil.log方法中。LogUtil.log方法会根据该方法上的Log注解来打印日志信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值