使用Sentry集中化日志管理
在调试程序中,通过日志分期来排查BUG是一个重要手段,它可以说是程序调试的利器。
关于日志管理
随着应用组件变多,那么各coder对输出日志五花八门,有写入stdout,有写stderr, 有写到syslog,也有写到xxx.log的。那么这将导致平台应用日志分布在各个地方,无法统一管理。
为什么使用Sentry
Sentry是一个集中式日志管理系统。它具备以下优点:
- 多项目,多用户
- 界面友好
- 可以配置异常出发规则,例如发送邮件
- 支持主流语言接口
安装
参考
https://docs.getsentry.com/on-premise/server/installation/
Requirements
- Linux Server
- PostgreSQL
- redis-server
- Python 2/3
- Nginx
步骤
安装依赖包
sudo apt-get install python-setuptools python-pip python-dev libxslt1-dev libxml2-dev libz-dev libffi-dev libssl-dev libpq-dev libyaml-dev
安装Sentry
pip install -U sentry==8.0.0rc2
配置
vim sentry.conf.py
DATABASES = {
'default': {
'ENGINE': 'sentry.db.postgres',
'NAME': 'sentry',
'USER': 'postgres',
'PASSWORD': '123456',
'HOST': 'localhost',
'PORT': '5432',
}
}
EMAIL_HOST = 'smtp.exmail.qq.com'
EMAIL_HOST_PASSWORD = 'HE*******'
EMAIL_HOST_USER = 'hewx@doordu.com'
EMAIL_PORT = 25
EMAIL_USE_TLS = False
设置配置文件路径到环境变量
export SENTRY_CONF=/home/hewx/workbench/sentry
初始化数据库
sentry update
配置Web Server
sudo apt-get install nginx-full
sudo vim /etc/nginx/sites-enabled/default location / {
proxy_pass http://localhost:9000;
proxy_redirect off; proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
启动
启动Wokers
sentry celery worker -B
启动Web服务
sentry start
实例
PHP
使用浏览器访问sentry,并创建一个项目
参考PHP使用指令http://10.0.0.180/sentry/45183e54fa36/settings/install/php/
<?php
require_once "vendor/autoload.php";
$client = new Raven_Client('http://5d68caa5e36c4eaa8f7c0601a521fab6:b5917e01d45f4656ab2d943264b90377@10.0.0.180/3');
$error_handler = new Raven_ErrorHandler($client);
$error_handler->registerExceptionHandler();
$error_handler->registerErrorHandler();
$error_handler->registerShutdownFunction();
$client->captureMessage("这里发生了一个错误");
$i = 1 / 0;
?>
Python
pip install raven
from raven import Client
client = Client('http://f1ba62aa87cb4fc1a36d9e4f96017e99:96f5feef13dc4d45825e73548cd5b784@10.0.0.180/4')
try:
1 / 0
except ZeroDivisionError:
client.captureException()
JavaScript
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Sentry Test</title>
</head>
<body>
<script src="https://cdn.ravenjs.com/2.0.1/raven.min.js"></script>
<script>
Raven.config('http://e896b37840444a41adc9a80aa1292dcb@10.0.0.180/5').install() try {
doSomething(a[0])
} catch(e) {
Raven.captureException(e)
} </script>
</body>
</html>
Android
https://github.com/joshdholtz/Sentry-Android/tree/android-studio-ify
import com.joshdholtz.sentry.Sentry;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Sentry.init(this, "http://10.0.0.180", "http://340137fc1dc6443e99d9d02b8f1638d0:cfd6587578e742948b60d72442fb4ac8@10.0.0.180/6");
Sentry.captureMessage("OMG this works woooo");
int a = 1 / 0;
}
......
RuntimeException: Unable to start activity ComponentInfo{com.joshdholtz.sentrytesting/com.joshdholtz.sentryapp.MainActivity}: java.lang.ArithmeticException: divide by zero
Module "android.app.ActivityThread", line 2189, in performLaunchActivity
Module "android.app.ActivityThread", line 2238, in handleLaunchActivity
Module "android.app.ActivityThread", line 138, in access$800
Module "android.app.ActivityThread$H", line 1201, in handleMessage
Module "android.os.Handler", line 102, in dispatchMessage
Module "android.os.Looper", line 136, in loop
Module "android.app.ActivityThread", line 5016, in main
Module "java.lang.reflect.Method", in invokeNative
Module "java.lang.reflect.Method", line 515, in invoke
Module "com.android.internal.os.ZygoteInit$MethodAndArgsCaller", line 792, in run
Module "com.android.internal.os.ZygoteInit", line 608, in main
Module "dalvik.system.NativeStart", in main
ArithmeticException: divide by zero
Module "com.joshdholtz.sentryapp.MainActivity", line 20, in onCreate
Module "android.app.Activity", line 5251, in performCreate
Module "android.app.Instrumentation", line 1087, in callActivityOnCreate
Module "android.app.ActivityThread", line 2153, in performLaunchActivity
Module "android.app.ActivityThread", line 2238, in handleLaunchActivity
Module "android.app.ActivityThread", line 138, in access$800
Module "android.app.ActivityThread$H", line 1201, in handleMessage
Module "android.os.Handler", line 102, in dispatchMessage
Module "android.os.Looper", line 136, in loop
Module "android.app.ActivityThread", line 5016, in main
Module "java.lang.reflect.Method", in invokeNative
Module "java.lang.reflect.Method", line 515, in invoke
Module "com.android.internal.os.ZygoteInit$MethodAndArgsCaller", line 792, in run
Module "com.android.internal.os.ZygoteInit", line 608, in main
Module "dalvik.system.NativeStart", in main
使用Sentry集中化日志管理的更多相关文章
- 快速搭建ELK集中化日志管理平台
由于我们的项目是分布式,服务分布于多个服务器上,每次查看日志都要登录不同服务器查看,而且查看起来还比较麻烦,老大让搭一个集中化日志管理的东西,然后就在网上找到了这个东西ELK ELK就是elastic ...
- 线上日志集中化可视化管理:ELK
本文来自网易云社区 作者:王贝 为什么推荐ELK: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...
- SQL Server中的事务日志管理(7/9):处理日志过度增长
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- SQL Server中的事务日志管理(9/9):监控事务日志
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- SQL Server中的事务日志管理(8/9):优化日志吞吐量
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- SQL Server中的事务日志管理(6/9):大容量日志恢复模式里的日志管理
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- SQL Server中的事务日志管理(5/9):完整恢复模式里的日志管理
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- SQL Server中的事务日志管理(4/9):简单恢复模式里的日志管理
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- SQL Server中的事务日志管理(3/9):事务日志,备份与恢复
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
随机推荐
- Java常见分页方式
1. 网站常见分页样式 采用传统的分页方式(邮件列表),可以明确的获取数据信息,如有多少条数据 分多少页显示等 采用下拉式的分页样式(QQ空间),一般无法获取明确的数据数量相关的信息,但是在分页操作之 ...
- Jmeter-性能测试(三)
一.调通脚本(以json串Post接口为例)添加聚合报告(线程组->添加->监听器->聚合报告)并调试好需要压测的脚本,如下已经调通的P_C_B151就是我需要压测的脚本 二.设置场 ...
- Redis Win平台安装
安装准备 Redis 官网:https://redis.io/ 中文官网:http://www.redis.cn/ Redis 在Window上并没有提供官方版本.所以可以去微软维护的包库上下载. 下 ...
- GoogLeNet模型的微调
我从零开始训练了GoogLeNet模型. 但它没有给我带来希望的结果. 作为替代,我想对我的数据集中的GoogLeNet模型进行微调. 有谁知道我应该遵循什么步骤? 采纳答案: 假设你正在尝试做图像分 ...
- ping的原理以及ICMP
ping 的原理: ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接. ping 使用的是ICMP协议,它发送icmp回送请求消 ...
- [原创]Linux实现服务延迟启动
在开机启动服务的时候,服务之间有依赖关系,必须在某个服务完全启动后才能启动其他的服务.在这种情况下,就需要用到服务延迟启动的功能.在开机时,延迟几分钟再启动.具体步骤如下:1.写一个实现延时启动的脚本 ...
- 【Android】 给我一个Path,还你一个酷炫动画
本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家公布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/53040506 ...
- linux学习之缓存机制
linux中的缓存机制 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回 ...
- iOS wkWebView点击链接无反应
在使用wkWebView的时候发现用webView加载youku.com,里面的视频链接点击是可以跳转的,但是呢,加载v.qq.com的时候发现链接点击又没有效果,折腾了很久最后找到解决方案 实现WK ...
- oracle 数据查询
1,读取从今天到1个月前之间的数据select * from tablewhere column between add_months(sysdate, -1) and sysdate;