测试过程中logging绝对占有不可或缺的地位,那我们如何将测试中的log真正的帮助到我们呢?比如和测试报告对应起来;对每天测试case进行进行log区分等都是能够帮助我们更好的开展工作,下面我们就介绍下log处理的一些相关函数,大家可以发挥想象怎么样能够更好的解决工作中的问题。
![](https://img-blog.csdnimg.cn/img_convert/ef8be65f291845918d7a5112faeecdee.png)
setLogFileName
![](https://img-blog.csdnimg.cn/img_convert/034f0414589444b4bdecfcd642d5b368.png)
功能:设置日志文件的名称。
说明:设置日志文件的名称。如果给定了有效的扩展名,则还会更改文件类型。
注意:此功能在独立模式下不可用。
fileName:名称可以是绝对路径、单个文件名或相对路径。如果提供了绝对路径或相对路径,则将创建该路径的所有不存在的目录。如果提供了单个文件名,则日志文件将放在当前配置的目录中;如果提供了相对路径,则日志将放在配置文件的相对路径中。路径的目录必须用反斜杠(“\”)分隔。文件名可以包含文件扩展名。如果未输入扩展名,将自动设置上次使用的文件类型。如果给定了无效的扩展名,该函数将不会执行任何操作。
在字符串文本中,必须设置第二个反斜杠。
新名称只能通过新的setLogFileName调用或日志文件配置对话框中的相应条目更改。
如果日志记录块未记录(日志记录未激活),则立即更改名称。
如果日志记录块记录(日志记录处于活动状态),则新名称将在下一个触发事件或新的测量开始时被接管。
保存配置时,不会保存使用setLogFileName函数设置的名称。只有在日志文件的配置对话框中设置的名称将被接管。
strLoggingBlockName:日志记录块的名称
Demo示例
...
setLogFileName("Logging1", "newlog");
...
Sets the name of the logging file to "newlog" in the directory of the current configuration.
...
setLogFileName("Logging1", "c:\\canw\\demo\\automot\\newlog");
...
Sets the absolute path of the logging file.
...
setLogFileName("Logging1", "..\\Logging\\newlog");
...
Sets the relative path of the logging file.
...
setLogFileName( "newlog.blf" );
...
Sets the name of the logging file to newlog and the file type blf
...
setLogFileName( "newlog.notSupportedExtension" );
...
Does nothing //file extension not valid
setPostTrigger
![](https://img-blog.csdnimg.cn/img_convert/03dd1ed3d97340f0a29af088632dbef7.png)
功能:设置日志的后触发器。
说明:设置日志的后触发器。使用此函数设置的后触发器在测量结束或下一次调用此函数之前有效。
注意:函数stopLogging()不考虑函数“setPostTrigger”的设置,请改用CAPL函数trigger()。
返回值:如果后触发器设置为给定值,则为1,否则则为0
Demo示例
on start
{
SetPreTrigger(5000);
SetPostTrigger(5000);
}
on key 'x'
{
//使用触发前和触发后设置启动和停止所有CAPL触发/记录块
trigger();
}
setPreTrigger
![](https://img-blog.csdnimg.cn/img_convert/fd7bef53b3054d89a7fd6286cca567ea.png)
功能:设置日志的预触发
说明:设置日志的预触发。使用此函数设置的预触发在测量结束或下一次调用此函数之前有效。
注意:函数startLogging()不考虑函数setPreTrigger的设置,而是使用CAPL函数trigger()。
返回值:如果后触发器设置为给定值,则为1,否则则为0
preTriggerTime:新的预触发值(毫秒)
Demo示例
on start
{
SetPreTrigger(5000);
}
on key 'x'
{
//使用触发前和触发后设置启动和停止所有CAPL触发/记录块
trigger();
}
startLogging
![](https://img-blog.csdnimg.cn/img_convert/bfc9f3be073a4df88f5a6d4cecfb38a3.png)
功能:启动log记录功能;保存trace中出现的所有log信息到指定文件中;可以设置保存log的名称以及触发时间
strLoggingBlockName:设置保存log的名称;如果在独立模式下使用该功能,并且在独立模式配置设置中激活了日志记录和触发块,则可以通过传递空字符串作为参数来解决在这种情况下可用的(单个)日志记录块。
preTriggerTime:预触发时间间隔(单位:毫秒);在使用preTriggerTime时,请注意记录块的触发器配置对话框中的缓冲区大小是相应设置的,以便可以记录给定时间间隔的所有事件。
Demo示例:
startLogging();
// 启动所有log模块保存
startLogging( "Logging 1");
// 启动log名称为 "Logging 1"的保存
startLogging( "Logging 1", 2000);
// 在2000毫秒后启动log名称为 "Logging 1" 的log保存
stopLogging
![](https://img-blog.csdnimg.cn/img_convert/ea4a7f80c9bf4c939b3e3fa333f5146a.png)
功能:停止log记录功能;保存trace中出现的所有log信息到指定文件中;可以设置保存log的名称以及停止log时间
strLoggingBlockName:设置保存log的名称;如果在独立模式下使用该功能,并且在独立模式配置设置中激活了日志记录和触发块,则可以通过传递空字符串作为参数来解决在这种情况下可用的(单个)日志记录块。
preTriggerTime:预触发时间间隔(单位:毫秒);在使用preTriggerTime时,请注意记录块的触发器配置对话框中的缓冲区大小是相应设置的,以便可以记录给定时间间隔的所有事件。
Demo示例:
stopLogging();
// 停止所有log的保存
stopLogging( "Logging 1");
// 停止log名称为 "Logging 1"的保存
stopLogging( "Logging 1", 1000);
// 在1000毫秒后启动log名称为 "Logging 1" 的log保存
trigger
![](https://img-blog.csdnimg.cn/img_convert/a88597c86728433cbb3b10c775367452.png)
功能:激活/停用所有记录和触发块的记录触发
说明:向所有CANoe日志记录或触发块发送触发事件,对于日志记录块,触发器事件开始和停止日志记录,具体取决于触发模式(单触发或拨动触发)、开关的触发条件、在该块的触发器配置对话框中设置。
对于触发块,触发事件启动和停止整个分析分支或单个分析窗口的数据流(如过滤器),这取决于触发配置对话框中的触发模式和触发条件。
Demo示例
on message 100
{
write("logging start");
trigger(); // start logging
setTimer(logging,1000); // for 1000 ms
}
on timer logging
{
trigger(); // Stop logging
}
triggerEx
![](https://img-blog.csdnimg.cn/img_convert/afc7a9b9194a4ceeb0a91df6da3adb33.png)
功能:激活/停用特殊记录或触发块的记录触发。
说明:向名称指定的CANoe日志记录或触发块发送触发事件。对于日志记录块,触发器事件开始和停止日志记录,具体取决于触发模式(单触发或拨动触发)、开关的触发条件、在该块的触发器配置对话框中设置。对于触发块,触发事件启动和停止整个分析分支或单个分析窗口的数据流(如过滤器),这取决于触发配置对话框中的触发模式和触发条件。如果未输入名称,则事件将发送到测量设置中CAPL函数triggerEx()位于CAPL节点后面的所有触发器和记录块。如果希望CAPL节点对所有触发块都有效,则必须将CAPL节点直接放置在联机/脱机切换之后。
name:日志记录或触发器块的名称。
Demo示例
on message 100
{
write("logging starts in Logging Block ""Logging""");
triggerEx("Logging"); // start logging
setTimer(logging,1000); // for 1000 ms
}
on timer logging
{
triggerEx("Logging"); // Stop logging
}
writeToLog
![](https://img-blog.csdnimg.cn/img_convert/ba4d5a312b0245a1902cb5c9e631055f.png)
功能:将输出字符串写入ASCII日志文件。
说明:编译器无法检查格式字符串。非法的格式条目将导致未定义的结果。与writeToLogEx函数不同,将在每行开头打印注释字符(“//”)和时间戳。
参数介绍:
CAPL Type | Display Description | Format Windows | Format Linux |
int | int型显示 | %d | %d |
long | long型显示 | %ld | %d |
int64 | int64型显示 | %I64d or %lld | %ld or %lld |
byte/word | 无符号显示 | %u | %u |
dword | 无符号显示 | %lu | %u |
qword | 无符号显示 | %I64u or %llu | %lu or %llu |
byte/word/int | 十六进制显示 | %x | %x |
dword/long | 十六进制显示 | %lx | %x |
qword/int64 | 十六进制显示 | %I64x or %llx | %lx or %llx |
byte/word/int | 十六进制显示(大写) | %X | %X |
dword/long | 十六进制显示(大写) | %lX | %X |
qword/int64 | 十六进制显示(大写) | %I64X or %llX | %lX or %llX |
byte/word/int | 八进制显示 | %o | %o |
dword/long | 八进制显示 | %lo | %o |
qword/int64 | 八进制显示 | %I64o or %llo | %lo or %llo |
float/double | 浮点型显示 | %g or %f | %g or %f |
字符型显示 | %c | %c | |
字符串显示 | %s | %s | |
%字符的显示 | %% | %% | |
dword | 32-bit pointer (without implicit pointer format 0xABABABAB) | %p | %08x |
32-bit pointer (with implicit pointer format 0xABABABAB) | %#p | %p | |
qword | 64-bit pointer (without implicit pointer format 0xABABABABABABABAB) | %I64p | %016lx |
64-bit pointer (with implicit pointer format 0xABABABABABABABAB) | %#I64p | %p |
Demo示例
void MarkLogFile(int marker)
{
// 用整数标记ASCII日志文件的行
writeToLog("===> %d",marker);
}
writeToLogEx
![](https://img-blog.csdnimg.cn/img_convert/c0dd2bcbe865486cad9a1f144b088e7f.png)
功能:将输出字符串写入ASCII日志文件。
说明:编译器无法检查格式字符串。非法的格式条目将导致未定义的结果。与writeToLog函数不同,注释字符(“//”)和时间戳都不会打印在行的开头。结果字符串的最大长度限制为1024个字符,将没有注释字符的自生成行导入CANoe可能会导致问题
Demo示例
// 将带有当前日期和时间的标记写入日志文件
void MarkLogFileWithTimeString(void)
{
char timeBuffer[64];
getLocalTimeString(timeBuffer);
writeToLogEx("===> %s",timeBuffer);
}
以上是对于Trace log中的一些操作,当然实际使用中我们可以跟其他的一些函数相互使用,比如我们将函数getLocalTime和startLogging组合起来就可以对每一条测试testcase的log进行保存而不会被覆盖,并且能够跟测试报告中的内容进行一一对应,对于时候分析报告、确认问题非常方便,更多的使用方法欢迎评论区交流。