使用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):事务日志,备份与恢复
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
随机推荐
- SVN学习(二)——SVN 提交、更新、解决冲突等操作步骤
1. 纳入版本控制 ①新建文件abc.txt ②在文件上点右键 ③添加后文件图标发生变化 2. 提交 ①使用TortoiseSVN可以提交具体某一个文件,或某一个目录下的所有改变.方法就是在想要提交的 ...
- 【C语言天天练(二三)】errno变量
引言: 在C编程中,errno是个必不可少的变量.特别是在网络编程中. 假设你没实用过errno,那仅仅能说明你的程序不够健壮. 为什么会使用errno呢?这是系统库设计中的一个无奈之举.他很多其它的 ...
- 无线网络RSSI、SSID、BSSID
获取无线网络,及无线网络的参数之前,我们先了解一下RSSI,SSID和BSSID分别是什么,当然你可以去百度或者维基百科查阅,我这里只是简单的说明一下.RSSI就是无线网络的信号强度,这个是和无线AP ...
- TensorFlow学习笔记 补充2—— 生成特殊张量
1. 生成tensor tf.zeros(shape, dtype=tf.float32, name=None) tf.zeros_like(tensor, dtype=None, name=None ...
- python-class(4)
#!/usr/bin/env python #-*- coding:utf-8 -*- ############################ #File Name: class4.py #Auth ...
- 探讨电子商务新的商业模式O2O
在当前的市场经济大环境下,电子商务成为了众 多中小企业用以开拓市场的主要工具,成为突破企业管理瓶颈的重要手段.必卖电子商务顾问认为,电子商务应该是是线上业务与线下业务的结合.对于从线下渠道 起家的传统 ...
- Tomcat运行流程
Connector介绍 1.1 Connector的种类 Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector分为以下几类: Http Conn ...
- Python - except不指定异常类别(转)
From:How to properly ignore Exceptions? try: doSomething() except: pass or try: doSomething() except ...
- git branch merge到master
使用merge可以合并多个历史记录的流程. 如下图所示,bugfix分支是从master分支分叉出来的. 合并 bugfix分支到master分支时,如果master分支的状态没有被更改过,那么这个合 ...
- js的一些技巧总结
1. 将彻底屏蔽鼠标右键 <body oncontextmenu="return false"> ''''' </body> 或者 <table b ...