我制作了2个记录器,每个线程对应一个(THREAD = 2):
lsd_logger[THREADS] : list of message_logger is instance;
keep for each in lsd_logger {
soft it.tags == {appendf("DBG%d",index).as_a(message_tag)};
it.to_file == appendf("lsd%d.elog", index);
soft it.verbosity == HIGH;
it.to_screen == FALSE;
};
现在我有一个检查器,我想根据当前运行的线程向每个记录器发送一条消息,如下所示:
messagef(appendf("DBG%d",thread).as_a(message_tag), MEDIUM, "this is a message to logger %d",thread);
但是我不断得到关于这不是一个常数冗长的错误。
有没有办法像这样给出message_tag而不是创建一个func来处理打印?
谢谢,
答案 0 :(得分:3)
不,这是不可能的。消息的标记必须是硬编码的,因此它应该是一个常量标记,而不是任何返回标记的表达式。
您可以通过定义这样的方法来解决问题:
my_message() is {
case thread {
0: {
messagef(DBG0, MEDIUM, "this is a message to logger 0");
};
1: {
messagef(DBG1, MEDIUM, "this is a message to logger 1");
};
};
};
然后,如果你想避免用重复代码编写这个非常长的方法(你甚至需要在每次线程数改变时修改),你可以使用define as computed
宏,例如:
define <my_message'action> "my_message" as computed {
items: list of string;
for i from 0 to THREADS-1 do {
items.add(appendf("%d: {messagef(DBG%d, MEDIUM, \"this is a message to logger %d\")}", i, i, i));
};
result = appendf("case thread { %s }", str_join(items, ";"));
};