Helpful logging and error format
Inspired by this blog post.
Work in Progress
LogUtil.h@5:1b4f4d4aec8c, 2013-04-26 (annotated)
- Committer:
- sam_grove
- Date:
- Fri Apr 26 06:28:00 2013 +0000
- Revision:
- 5:1b4f4d4aec8c
- Parent:
- 2:c54746c59ba4
- Child:
- 6:163b9d47fa87
fflush() all streams when used. pointer to the same stream (maybe repetitive calls too) mix up the output;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sam_grove | 0:3054bbdace4c | 1 | /** |
sam_grove | 0:3054bbdace4c | 2 | * @file LogUtil.h |
sam_grove | 0:3054bbdace4c | 3 | * @brief Utility to log messages during runtime |
sam_grove | 0:3054bbdace4c | 4 | * @author sam grove |
sam_grove | 0:3054bbdace4c | 5 | * @version 1.0 |
sam_grove | 1:491d2a7f4207 | 6 | * @see http://www.drdobbs.com/cpp/a-lightweight-logger-for-c/240147505 |
sam_grove | 0:3054bbdace4c | 7 | * |
sam_grove | 0:3054bbdace4c | 8 | * Copyright (c) 2013 |
sam_grove | 0:3054bbdace4c | 9 | * |
sam_grove | 0:3054bbdace4c | 10 | * Licensed under the Apache License, Version 2.0 (the "License"); |
sam_grove | 0:3054bbdace4c | 11 | * you may not use this file except in compliance with the License. |
sam_grove | 0:3054bbdace4c | 12 | * You may obtain a copy of the License at |
sam_grove | 0:3054bbdace4c | 13 | * |
sam_grove | 0:3054bbdace4c | 14 | * http://www.apache.org/licenses/LICENSE-2.0 |
sam_grove | 0:3054bbdace4c | 15 | * |
sam_grove | 0:3054bbdace4c | 16 | * Unless required by applicable law or agreed to in writing, software |
sam_grove | 0:3054bbdace4c | 17 | * distributed under the License is distributed on an "AS IS" BASIS, |
sam_grove | 0:3054bbdace4c | 18 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
sam_grove | 0:3054bbdace4c | 19 | * See the License for the specific language governing permissions and |
sam_grove | 0:3054bbdace4c | 20 | * limitations under the License. |
sam_grove | 0:3054bbdace4c | 21 | */ |
sam_grove | 0:3054bbdace4c | 22 | |
sam_grove | 0:3054bbdace4c | 23 | #ifndef LOGUTIL_H |
sam_grove | 0:3054bbdace4c | 24 | #define LOGUTIL_H |
sam_grove | 0:3054bbdace4c | 25 | |
sam_grove | 2:c54746c59ba4 | 26 | #include <stdio.h> |
sam_grove | 2:c54746c59ba4 | 27 | #include <stdlib.h> |
sam_grove | 2:c54746c59ba4 | 28 | |
sam_grove | 0:3054bbdace4c | 29 | #define STREAM stdout |
sam_grove | 0:3054bbdace4c | 30 | #define LOG(...) \ |
sam_grove | 0:3054bbdace4c | 31 | fprintf(STREAM, "LOG: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \ |
sam_grove | 5:1b4f4d4aec8c | 32 | fprintf(STREAM, ##__VA_ARGS__); \ |
sam_grove | 5:1b4f4d4aec8c | 33 | fflush(STREAM) |
sam_grove | 0:3054bbdace4c | 34 | #define WARN(...) \ |
sam_grove | 0:3054bbdace4c | 35 | fprintf(STREAM, "WARN: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \ |
sam_grove | 5:1b4f4d4aec8c | 36 | fprintf(STREAM, ##__VA_ARGS__); \ |
sam_grove | 5:1b4f4d4aec8c | 37 | fflush(STREAM) |
sam_grove | 0:3054bbdace4c | 38 | #define ERROR(...) \ |
sam_grove | 0:3054bbdace4c | 39 | fprintf(STREAM, "ERROR: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \ |
sam_grove | 1:491d2a7f4207 | 40 | fprintf(STREAM, ##__VA_ARGS__); \ |
sam_grove | 1:491d2a7f4207 | 41 | fflush(STREAM); \ |
sam_grove | 1:491d2a7f4207 | 42 | exit(1) |
sam_grove | 0:3054bbdace4c | 43 | |
sam_grove | 0:3054bbdace4c | 44 | /** Using the LogUtil class |
sam_grove | 0:3054bbdace4c | 45 | * |
sam_grove | 0:3054bbdace4c | 46 | * Example: |
sam_grove | 0:3054bbdace4c | 47 | * @code |
sam_grove | 0:3054bbdace4c | 48 | * #include "mbed.h" |
sam_grove | 0:3054bbdace4c | 49 | * #include "LogUtil.h" |
sam_grove | 0:3054bbdace4c | 50 | * |
sam_grove | 1:491d2a7f4207 | 51 | * LogUtil logger; |
sam_grove | 0:3054bbdace4c | 52 | * |
sam_grove | 0:3054bbdace4c | 53 | * int main() |
sam_grove | 0:3054bbdace4c | 54 | * { |
sam_grove | 0:3054bbdace4c | 55 | * LOG("This is a log\n"); |
sam_grove | 0:3054bbdace4c | 56 | * WARN("This is a warning\n"); |
sam_grove | 0:3054bbdace4c | 57 | * |
sam_grove | 1:491d2a7f4207 | 58 | * for(int i=0; i<3; ++i) { |
sam_grove | 0:3054bbdace4c | 59 | * LOG("Log message #%d\n", i); |
sam_grove | 0:3054bbdace4c | 60 | * } |
sam_grove | 0:3054bbdace4c | 61 | * |
sam_grove | 1:491d2a7f4207 | 62 | * for(int i=0; i<3; ++i) { |
sam_grove | 0:3054bbdace4c | 63 | * WARN("Warn message #%d\n", i); |
sam_grove | 0:3054bbdace4c | 64 | * } |
sam_grove | 0:3054bbdace4c | 65 | * |
sam_grove | 1:491d2a7f4207 | 66 | * ERROR("This is an error\n"); |
sam_grove | 0:3054bbdace4c | 67 | * } |
sam_grove | 0:3054bbdace4c | 68 | * @endcode |
sam_grove | 0:3054bbdace4c | 69 | */ |
sam_grove | 0:3054bbdace4c | 70 | |
sam_grove | 0:3054bbdace4c | 71 | /** |
sam_grove | 0:3054bbdace4c | 72 | * @class LogUtil |
sam_grove | 0:3054bbdace4c | 73 | * @brief Different ways to log messages having a standard interface |
sam_grove | 0:3054bbdace4c | 74 | */ |
sam_grove | 0:3054bbdace4c | 75 | class LogUtil |
sam_grove | 0:3054bbdace4c | 76 | { |
sam_grove | 0:3054bbdace4c | 77 | public: |
sam_grove | 0:3054bbdace4c | 78 | |
sam_grove | 0:3054bbdace4c | 79 | /** Construct the LogUtil class and configure |
sam_grove | 0:3054bbdace4c | 80 | */ |
sam_grove | 0:3054bbdace4c | 81 | LogUtil(); |
sam_grove | 0:3054bbdace4c | 82 | |
sam_grove | 0:3054bbdace4c | 83 | }; |
sam_grove | 0:3054bbdace4c | 84 | |
sam_grove | 0:3054bbdace4c | 85 | |
sam_grove | 0:3054bbdace4c | 86 | #endif |
sam_grove | 0:3054bbdace4c | 87 | |
sam_grove | 0:3054bbdace4c | 88 |