我在AWS lambda中执行了小的Python代码, 但Lambda以非常不方便的格式将日志放入CloudWatch Logs:
我想将这些日志发送给ELK进行可视化。有没有办法将所有Lambda迭代日志放到一个json文件中?
答案 0 :(得分:2)
尝试按以下方式编写日志:
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def my_logging_handler(event, context):
logger.error(
json.dumps(
{
'key1': 'value1',
'key2': 'value2'
}
)
)
return 'Hello from Lambda!'
答案 1 :(得分:2)
预加载的var myCollection = new KeyedByTypeCollection<A>();
myCollection.Add(new A());
myCollection.Add(new B());
myCollection.TryGetValue(out B b); // <-- Nice! :)
b = myCollection.ValueOrDefault<B,A>(); // <-- Ugly :(
使用标准类LambdaLoggerHandler
。
来源:https://www.denialof.services/lambda/
用一个输出到JSON的自定义类替换格式化程序。
此外,logging.Formatter
字典可以包含附加值,extra
避免与其他日志记录属性发生冲突。
extra['data']
但是,任何堆栈跟踪都照常进行渲染。
然后CloudWatch得到这个:
import logging
import json
class FormatterJSON(logging.Formatter):
def format(self, record):
record.message = record.getMessage()
if self.usesTime():
record.asctime = self.formatTime(record, self.datefmt)
j = {
'levelname': record.levelname,
'time': '%(asctime)s.%(msecs)dZ' % dict(asctime=record.asctime, msecs=record.msecs),
'aws_request_id': getattr(record, 'aws_request_id', '00000000-0000-0000-0000-000000000000'),
'message': record.message,
'module': record.module,
'extra_data': record.__dict__.get('data', {}),
}
return json.dumps(j)
logger = logging.getLogger()
logger.setLevel('INFO')
formatter = FormatterJSON(
'[%(levelname)s]\t%(asctime)s.%(msecs)dZ\t%(levelno)s\t%(message)s\n',
'%Y-%m-%dT%H:%M:%S'
)
# Replace the LambdaLoggerHandler formatter :
logger.handlers[0].setFormatter(formatter)
def lambda_handler(event, context):
my_input = {
'key1': 'value1',
'key2': 'value2'
}
logger.info('Process Info: %s', 'Hello', extra=dict(data=my_input))
答案 2 :(得分:1)
您应该将应用程序设置为以JSON身份登录。这样,您可以将所有信息记录为单个JSON行。这样也可以更容易地在ELK下游进行分析。
例如,您可以使用Watchtower:
import watchtower, logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.addHandler(watchtower.CloudWatchLogHandler())
logger.info("Hi")
logger.info(dict(foo="bar", details={}))
这不包括START和END行,但您可以随时让应用程序添加该信息。
答案 3 :(得分:0)
简而言之,没有办法强制所有日志转到一个日志流。它们都应该在同一个日志组中。无论何时部署新版本或每当新的lambda实例旋转时,Lambda都会创建一个新的日志流。在将这些数据导入ELK时,您有几个选择。