我一直在为一个吸引大量数据的项目做一些亚马逊AWS修补工作.大多数服务都是超级便宜的,但Cloud Watch的日志存储占主导地位,云计算日志存储在18美元的总账单中占13美元.我已经删除了日志.
如何从存储中删除日志(从控制台中删除组似乎没有这样做)或降低日志的成本(这篇文章表明它应该是0.03美元/ GB,我的更多)或者是其他东西?
人们使用什么策略?
java中是否有任何方法可以在从日志组获取日志事件之前检查给定的日志组和日志流是否存在?
java amazon-web-services aws-sdk aws-java-sdk amazon-cloudwatchlogs
我正在寻找适用于 Log4J2 的官方 AWS CloudWatch Appender。我找遍了,没有找到。
有人在 Java 应用程序中使用 Log4J2 使用 CloudWatch 吗?
在创建 AWS CloudWatch Log Metric Filter 时,您将如何匹配 JSON Log Events 中键名称中包含字符空格的术语?
例如,假设有一个带有 JSON 元素的日志行,如下所示...
{"Event":"SparkListenerLogStart","Spark Version":"2.4.0-SNAPSHOT"}
Run Code Online (Sandbox Code Playgroud)
您将如何引用“Spark 版本”?$."Spark Version", $.Spark Version, $.Spark\ Version, 和$.[Spark Version]不工作。
我在AWS 过滤器和模式语法文档 中找不到答案。
我正在尝试为我的 Firehose 捕获 Cloudwatch 日志,以在将数据发送到S3目的地时发现任何错误。我创建了一个带有日志详细信息的 cloudformation 模板
"CloudWatchLoggingOptions" : {
"Enabled" : "true",
"LogGroupName": "/aws/firehose/firehose-dev", -->firehose-dev is my firehosedeliverystream name
"LogStreamName" : "s3logs"
},
Run Code Online (Sandbox Code Playgroud)
我已授予必要的 IAM 权限来创建loggroupname和streamname.
{
"Sid": "",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:*:*:*"
]
}
Run Code Online (Sandbox Code Playgroud)
当我触发模板时,我没有在 cloudwatch 日志中找到任何日志组名和流名。
但是当我们为AWS::Lambda资源提供相同的 IAM 权限时,它会自动创建一个/aws/lambda/mylambdaname日志组名(即)并将日志发送到该组。但是为什么这种情况不适用于 firehose ?
作为解决方法
我手动创建AWS::Logs::LogGroup与名称资源/aws/firehose/firehose-dev和AWS::Logs::LogStream资源使用的名称s3logs。
如果我们使用控制台配置 firehose 传输流,firehose 也会自动创建日志组名称和日志流名称。
通过 cloudformation 配置时,firehose 不能像 aws …
amazon-web-services aws-cloudformation amazon-cloudwatchlogs amazon-kinesis-firehose
(在将所有日志打印到CloudWatch Logs之前退出AWS-ECS上的Docker容器)为什么CloudWatch Logs组的某些流不完整(即Fargate Docker Container成功退出,但日志突然停止更新)?间歇地在几乎所有日志组中看到此消息,但并不是在每个日志流/任务运行时都看到这一点。我正在1.3.0版上运行
Dockerfile使用该CMD命令运行node.js或Python脚本。
这些不是服务器/长时间运行的进程,我的用例要求容器在任务完成时退出。
样本Dockerfile:
FROM node:6
WORKDIR /path/to/app/
COPY package*.json ./
RUN npm install
COPY . .
CMD [ "node", "run-this-script.js" ]
Run Code Online (Sandbox Code Playgroud)
当使用本地在终端上运行此命令时,所有日志都会正确打印到终端的stdout / stderr中docker run。
要将其作为Fargate上的ECS任务运行,请awslogs从CloudFormation模板设置日志驱动程序为。
...
LogConfiguration:
LogDriver: 'awslogs'
Options:
awslogs-group: !Sub '/ecs/ecs-tasks-${TaskName}'
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: ecs
...
Run Code Online (Sandbox Code Playgroud)
看到cloduwatch日志输出有时不完整,我进行了测试并检查了CW Logs Limits中的每个限制,并且确定问题不存在。
我最初以为这是节点js在console.log()刷新之前异步退出的问题,或者进程退出得太早了,但是当我也使用另一种语言时,也会出现相同的问题-这使我相信这与代码,而是专门使用cloudwatch。
通过添加一个睡眠计时器在代码中引起延迟对我没有用。
有可能由于docker容器在任务完成后立即退出,因此日志没有足够的时间写到CWLogs,但是必须有一种方法来确保不会发生这种情况?
样本日志:流不完整:
{ "message": "configs to run", "data": {"dailyConfigs":"filename.json"]}}
running for filename
Run Code Online (Sandbox Code Playgroud)
完成的日志流:
{ "message": "configs …Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-ecs docker amazon-cloudwatchlogs docker-container
当console.log用于将日志行添加到 AWS CloudWatch 时,Lambda 请求 ID 被添加到每行,如文档中所述
基于上述文档的简化示例
exports.handler = async function(event, context) {
console.log("Hello");
return context.logStreamName
};
Run Code Online (Sandbox Code Playgroud)
会产生输出,如
开始请求 ID:c793869b-ee49-115b-a5b6-4fd21e8dedac 版本:$LATEST
2019-06-07T19:11:20.562Z c793869b-ee49-115b-a5b6-4fd21e8dedac 信息你好
END 请求 ID:c793869b-ee49-115b-a5b6-4fd21e8dedac
REPORT RequestId:c793869b-ee49-115b-a5b6-4fd21e8dedac 持续时间:170.19 ms 计费持续时间:200 ms 内存大小:128 MB 已用最大内存:73 MB
此处关于此问题的相关详细信息是请求 ID,c793869b-ee49-115b-a5b6-4fd21e8dedac它添加在带有“Hello”的行上的时间戳之后。
AWS 文档指出
要从函数代码输出日志,您可以使用控制台对象上的方法,或任何写入 stdout 或 stderr 的日志库。
Node.js 运行时会记录每次调用的 START、END 和 REPORT 行,并向函数记录的每个条目添加时间戳、请求 ID 和日志级别。
使用 Winston 作为记录器时,请求 ID 会丢失。可能是带有格式化程序或传输的问题。记录器是这样创建的
const logger = createLogger({
level: 'debug',
format: combine(
timestamp(),
printf(
({ timestamp, level, message }) …Run Code Online (Sandbox Code Playgroud) amazon-web-services winston aws-lambda amazon-cloudwatchlogs
我正在尝试使用 aws log Insights 对包含 nginx 日志的日志组运行查询。
这是我在 ec2 机器上设置的日志格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
Run Code Online (Sandbox Code Playgroud)
NGINX 日志示例:
xx.xx.xx.xx - - [10/Nov/2020:15:28:30 +0530] "POST /xx HTTP/1.1" 200 57 "https://xxxx.in/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
Run Code Online (Sandbox Code Playgroud)
我尝试使用日志见解和以下代码来解析它:
parse @message '* - - [*] "* * *" * * "-" "*"' as remote_addr, timestamp, request_type, location, protocol, response_code, body_bytes_sent
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Expression is invalid: parse@message'* - - …Run Code Online (Sandbox Code Playgroud) nginx amazon-cloudwatch amazon-cloudwatchlogs aws-cloudwatch-log-insights
我在 EKS 集群上作为 sidecar 运行 Fluent-bit,以便应用程序跟踪应用程序日志文件并将事件写入 CloudWatch Logs。然后,我通过 CloudWatch Logs Insights 设置一些查询和仪表板来分析这些日志。这一切都很好。
在我能够让这个设置工作之前,我在过去的一周里有一些较旧的日志。在 Fluent-bit tail 输入中,如果发现新文件,它可以选择完全从顶部读取新文件。使用此选项,我能够将较旧的日志加载到与最新日志事件相同的日志组中的 CloudWatch Logs 中。
如果我进入 AWS 控制台并进入我的日志组,我可以看到列出的所有日志流。我可以点击每个事件并查看事件并搜索它们。一切看起来都不错。但是,当我尝试使用 Insights 查询较旧的流时,没有显示任何结果。我已确认我为查询设置了一个应包含事件的时间段。
当我运行此查询时,我没有得到任何结果:
filter @logStream = 'myfile.log'
| fields @timestamp, @message
Run Code Online (Sandbox Code Playgroud)
具有较旧时间戳的日志事件是否不会自动提取到 Insights 中?数据可用之前是否有很长的延迟?我在文档中没有看到任何有关它的内容。
amazon-web-services amazon-cloudwatchlogs aws-cloudwatch-log-insights
我想在 AWS CloudWatch Logs Insights 中创建包含两行的折线图。一条线代表移动用户和其他桌面用户,显示每组用户的成功率。
这是我正在使用的代码:
| fields
properties.device as device,
properties.success as success
| stats avg(success) by device, bin(1hour)
Run Code Online (Sandbox Code Playgroud)
这个查询的结果看起来很有希望。如您所见,结果包括设备类型、时间戳和要绘制在折线图上的浮点数:
# device bin(1hour) avg(success)
1 desktop 2023-02-01T10:00:00.000 0.6129
2 mobile 2023-02-01T10:00:00.000 0.7453
3 desktop 2023-02-01T09:00:00.000 0.5578
4 mobile 2023-02-01T09:00:00.000 0.6082
Run Code Online (Sandbox Code Playgroud)
但是,“可视化”选项卡向我显示了此错误:
The data is not suitable for a line chart.
Try a bar chart, or group your result by bin function.
Run Code Online (Sandbox Code Playgroud)
我认为 Logs Insights 对我重叠的时间戳感到困惑。它不知道我想要一个移动数据的时间序列和另一个桌面数据的时间序列。要按字段分组并按时间分组,我似乎正在使用带有两个参数的单个操作来执行标准操作by。但它还不足以创建折线图。
有没有更好的方法来构建我的查询以使 CloudWatch 相信我正在尝试做的事情?
visualization group-by amazon-cloudwatch amazon-cloudwatchlogs aws-cloudwatch-log-insights
aws-cloudwatch-log-insights ×3
amazon-ecs ×1
aws-java-sdk ×1
aws-lambda ×1
aws-sdk ×1
docker ×1
group-by ×1
java ×1
log4j ×1
log4j2 ×1
nginx ×1
winston ×1