我在写一个Log类,该Log类可能被其他类调用来写日志, 日志里我想记录调用方的类名或者文件名以及调用方所在的行数,怎么做呢?不想传文件名做参数

rambooo 2008-07-15 08:04:28
我在写一个Log类,该Log类可能被其他类调用来写日志,
日志里我想记录调用方的类名或者文件名,
例如在A类中,Log类应能取得类A的名字A或者类A所在文件的名字,
在B类中,若B使用了Log类,则Log类应能获得类B的名字B 或者类B所在的文件名
_FILE_和_LINE_只能获得Log类所在的文件名和行数


怎么做呢? 不想把文件名当参数传进来,求教
...全文
290 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Paradin 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tobylee999 的回复:]
c++不传位置信息是不可能的,但可能再加一个类或使用宏封装一下。

每个实际使用的log类做成对象,构造要求使用者填充位置参数,log类内部使用位置信息调用实现类真正的写日志。

C/C++ code
MyLog::MyLog( const char *pFile, int line )
{
m_File = pFile;
m_Line = line;
}
MyLog::Error( const char *info )
{
RealLog::Instance()->Write( m_File, m_Line,
}

MyLog log(__FILE__,__LINE__);
log.E…
[/Quote]
d
wanghuicai_123 2009-04-01
  • 打赏
  • 举报
回复
package component.log4j;

import org.apache.log4j.Logger;

public class CommonLogger {

private static StackTraceElement element = new Exception().getStackTrace()[1];

private static Logger appLogger = null;

public static void intiLogger(){
appLogger = Logger.getLogger(CommonLogger.element.getClassName());
}

public static void appDebug(Object obj){
intiLogger();
appLogger.debug(obj);
}
public static void appInfo(Object obj){
intiLogger();
appLogger.info(obj);
}
public static void appWarn(Object obj){
intiLogger();
appLogger.warn(obj);
}
public static void appError(Object obj){
intiLogger();
appLogger.error(obj);
}

public static void appLogException(Object obj, Throwable t ){
intiLogger();
appLogger.error(obj,t);
}

public static void appLogException( Throwable t ){
intiLogger();
appLogger.error("Stack Trace:",t);
}
}

//测试包,打出当前的类的名字
package component.test;

import component.log4j.CommonLogger;

public class LoggerTest {

public static void main(String[] args) {
System.out.println("error packageName className ");
CommonLogger.appDebug("this is debug! ");
}
}

//log4j.properties 文件中要加必须有下一句
log4j.appender.console.layout.ConversionPattern =%d{yyyy-MM-dd HH:mm:ss}[%t] %-5p %c -%m%n
tobylee999 2008-07-24
  • 打赏
  • 举报
回复
我写了一个基础软件包里面有日志的实现,比较复杂。
http://blog.csdn.net/tobylee999/archive/2008/07/15/2655540.aspx
tobylee999 2008-07-24
  • 打赏
  • 举报
回复
c++不传位置信息是不可能的,但可能再加一个类或使用宏封装一下。

每个实际使用的log类做成对象,构造要求使用者填充位置参数,log类内部使用位置信息调用实现类真正的写日志。

MyLog::MyLog( const char *pFile, int line )
{
m_File = pFile;
m_Line = line;
}
MyLog::Error( const char *info )
{
RealLog::Instance()->Write( m_File, m_Line,
}

MyLog log(__FILE__,__LINE__);
log.Error("this is a test");



当然,不用构造函数也可以直接在接口中加入来源信息,这样对使用者来说稍不方便

MyLog::Error( const char *pFile, int line, const char *pInfo )
{
...
}


如果想更好看一点,使用宏包装一下定义操作,当然会牺牲一点可读性

#define AllocLog(name) MyLog log(__FILE__,__LINE__)

AllocLog(log);
log.Error(...)




daidodo 2008-07-24
  • 打赏
  • 举报
回复
更好的做法是调用logger的类把自己的类名传进去,甚至是写日志的函数把自己的函数名写进去。


int CServerStatistic::doIt()
{
LOCAL_LOGGER(logger,"CServerStatistic::doIt"); //生成名为logger的日志对象
DEBUG("open server status file "<<serverStatusFile_); //使用logger对象写日志,会把前面的函数名自动加到日志行前面
}
daidodo 2008-07-24
  • 打赏
  • 举报
回复
试试 __PRETTY_FUNCTION__ 宏
ouyh12345 2008-07-15
  • 打赏
  • 举报
回复
ouyh12345 2008-07-15
  • 打赏
  • 举报
回复
需要宏,向log类传文件名、行数等参数

需要C99的支持
kingstarer 2008-07-15
  • 打赏
  • 举报
回复
没偏啊 即然C++没有这个接口 那就自己定义一个啊 调用时可以这样

Log demo;
demo.write(this);

write函数会调用this的接口函数以获得类名 但这个接口函数要由调用类实现
xuxichun 2008-07-15
  • 打赏
  • 举报
回复
在C#当中是用StackFrame来获得caller得类名等信息
在C++中,不知道有没有这样得接口
楼主想让code自己来获得caller得信息
楼上得2位说得答案好像偏离了
kingstarer 2008-07-15
  • 打赏
  • 举报
回复
做一个接口,要调用你的日志类的都要实现这个接口
andy_cai 2008-07-15
  • 打赏
  • 举报
回复
不传参数,那就在A,B类中给log类对象的文件名成员赋值罗

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧