Yii2项目整合阿里云日志服务

原因 公司的php项目之前的日志基本是存数据库,存服务器文件,存在占用数据库大量空间,日志查看存在难以看到完整上下文,服务器上查找日志困难等问题,急需解决方案 方案 1.购买阿里云ELK:缺点贵 2.购买阿里云服务器自己搭ELK:虽然便宜些,但是增加运维成本 3.使用阿里云的日志服务,官方示例项目 优点:1.便宜 2:方便接入 3:机器人日志已有使用经验 4:在app即将上线的时候能够快速接入 示例项目 依赖引入 进入项目根目录,执行 composer require –prefer-dist ranvk/yii2-aliyun-logtarget -vvv composer.json文件中会增加 "ranvk/yii2-aliyun-logtarget": "^18.3" 修改配置,dev和local环境配置阿里云的外网地址,才可以上传日志,在线上的test和prod环境,使用内网地址,加快日志上传速度 api/config/dev/main.php 修改log的组件 ```php 'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning', 'trace', 'info'], ], [ 'levels' => ['error', 'warning', 'info'], 'class' => 'Ranvk\Yii2AliyunLogtarget\AliyunLogTarget', 'logstore' => 'www-xxx-com', 'topic' => YII_ENV, 'project' => 'c5game-webserver', 'accessKeyId' => 'xxx', 'accessKeySecret' => 'xxx', 'endpoint' => 'cn-shanghai.log.aliyuncs.com', //外网地址,内网地址为cn-shanghai-intranet.log.aliyuncs.com ], ], ], ``` 1. 其他环境的配置文件类似,别忘了修改 2. 具体代码 [http://xxxx/-/merge_requests/49/diffs](http://git.c5game.com/zbt/www.zbt.com/-/merge_requests/49/diffs) 查询示例 网址:https://sls.console.aliyun.com/lognext/project/xxx ...

September 29, 2020 · 1 min · 97 words · Jimmy

关于k8s集群中的容器资源限制以及JAVA应用运行参数设置

背景 目前存在一些应用频繁重启的问题,查看日志,有的显示容器被驱逐(evic),这种情况一般为资源使用超过配置的限制,k8s为了整体稳定性进行服务的重启,防止一些应用层的内存泄漏问题导致整体服务稳定性下降 针对此问题,需要调研k8s集群中,容器的内存分配,以及应用是否能正确识别到分配的容器内存限制 现状 目前线上的java应用使用的基础镜像为:library/openjdk8-skywalking:latest 此镜像的项目地址为 :middleware/docker-image-openjdk8-skywalking 此基础镜像包含的软件为: openjdk-8u212 nginx curl vim php7 php7-pecl-mongodb skywalking 线上使用配置 通过设置环境变量,运行脚本使用环境变量配置jvm参数实现 ![](https://i.loli.net/2021/04/29/nQJ4sRZp791HAhi.png) 本地测试结果 自动方案 不带jvm参数运行,看默认配置为多少内存,给容器设置最大内存限制为2GB,jvm设置的最大堆内存为455.50M,约为1/4最大内存,符合预期 docker run -m 2GB –rm reg.xxxx.cn/library/openjdk8-skywalking:latest java -XshowSettings:vm -version VM settings: Max. Heap Size (Estimated): 455.50M Ergonomics Machine Class: server Using VM: OpenJDK 64-Bit Server VM openjdk version “1.8.0_212” OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0) OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode) OpenJdk 自动识别到容器限制后,OpenJdk把最大堆设置为了大概容器内存的1/4,对内存的浪费不可谓不大。 我们尝试将MaxRAMFraction设置手动设置为1,可以看到最大堆内存将被设置为1.78G,我觉得这样的资源利用率比较高 ...

August 28, 2020 · 1 min · 178 words · Jimmy

杭州永辉菜价

西蓝花一小颗 1.5/斤 1元 南瓜一小片 0.8/斤 4元 芹菜少点 6/斤 6.9 姜两块 5.5/斤 5.7 黄瓜 1.5/斤 元 茄子 2/斤 3.5 菠菜 4元/斤 香菜 8.5斤 小油菜 3/斤3元 生菜 3/斤 3 元 香菇 7.5/斤+10/斤*0.5=12 西红柿 2.5/斤 4.9元 大葱 2块/斤 5元 黄豆芽两块钱的 2元 鸡胸肉四块 7/斤 10元 干豆腐 4元

August 22, 2020 · 1 min · 43 words · Jimmy

spring-boot不同的启动的方式

以mvn运行 #使用prod配置运行 mvn spring-boot:run -Dspring-boot.run.profiles=prod #后台运行无额外日志文件 nohup mvn spring-boot:run -Dspring-boot.run.profiles=prod >/dev/null 2>&1 & 以包运行 #默认配置 java -jar xxxx.jar #指定配置文件或者参数 java -Xms128m -Xmx256m -jar xxxx.jar --spring.profiles.active=prod #后台运行无额外日志文件 nohup java -Xms128m -Xmx256m -jar xxxx.jar --spring.profiles.active=prod >/dev/null 2>&1 &

March 18, 2020 · 1 min · 36 words · Jimmy

美团2019年货分享

📝美团年货分享 感谢关注美团技术团队。我们每周会推送来自一线的实践技术文章,涵盖前端(Web、iOS和Android)、后台、大数据、AI/算法、测试、运维等技术领域。在2019年春节到来之际,我们精选了114篇技术干货,制作成一本厚达1200多页的电子书呈送给大家。温馨提醒:文件有点大(全部下载约350M),请耐心等候下载。建议通过WIFI下载,或将地址复制到PC端,使用浏览器下载。【前端系列】下载链接:http://dpurl.cn/DWVhPpS【后台系列】下载链接:http://dpurl.cn/obtIVn【系统系列】下载链接:http://dpurl.cn/zTDWq8Q【算法系列】下载链接:http://dpurl.cn/ODj5qAB【运维系列】下载链接:http://dpurl.cn/6zjgHFj【测试系列】下载链接:http://dpurl.cn/wfKQqy【工程师成长系列】下载链接:http://dpurl.cn/p5sPoKT【2018年美团点评技术文章合辑】下载链接:http://dpurl.cn/iLGBtuS 🤗总结归纳 致谢:

March 5, 2019 · 1 min · 4 words · Jimmy

go-web程序的热更新

当使用go开发web程序时,修改点代码就得编译,虽然编译速度很快,但是也累啊,想起java的spring-boot有热更新插件, php根本都不需要重启,go怎么可以落后。 一顿搜索后,找到了gin和fresh,都挺好用的 gin cd path/to/app gin run main.go fresh cd path/to/app fresh 懒人有懒福~

September 30, 2018 · 1 min · 14 words · Jimmy

Manjaro安装fusuma

Manjaro安装fusuma 环境:Manjaro ██████████████████ ████████ jimersylee@jimersylee-laptop ██████████████████ ████████ OS: Manjaro 17.1.12 Hakoila ██████████████████ ████████ Kernel: x86_64 Linux 4.14.67-1-MANJARO ██████████████████ ████████ Uptime: 3h 12m ████████ ████████ Packages: 1184 ████████ ████████ ████████ Shell: zsh 5.5.1 ████████ ████████ ████████ Resolution: 1920x1080 ████████ ████████ ████████ DE: GNOME ████████ ████████ ████████ WM: GNOME Shell ████████ ████████ ████████ WM Theme: Adapta-Nokto-Maia ████████ ████████ ████████ GTK Theme: Adapta-Nokto-Maia [GTK2/3] ████████ ████████ ████████ Icon Theme: Papirus-Adapta-Maia ████████ ████████ ████████ Font: Noto Sans 11 ████████ ████████ ████████ CPU: Intel Core i7-8550U @ 8x 4GHz [47.0°C] GPU: Mesa DRI Intel(R) UHD Graphics 620 (Kabylake GT2) RAM: 6157MiB / 15928MiB 将用户加入输入组 sudo gpasswd -a $USER input sudo reboot 安装ruby环境,安装fusuma包 #安装ruby sudo pacman -S ruby sudo gem install fusuma # 配置 #将ruby程序目录加入路径 echo "export PATH=$PATH:/home/jimersylee/.gem/ruby/2.5.0/bin" >> ~/.profile source ~/.profile #人工启动 fusuma -d #加入开机启动 /usr/share/applications 新建一个.desktop快捷方式,配置好 使用tweaks 添加 startup application

September 12, 2018 · 1 min · 136 words · Jimmy

Manjaro安装Mariadb

Manjaro安装Mariadb 环境:Manjaro ██████████████████ ████████ jimersylee@jimersylee-laptop ██████████████████ ████████ OS: Manjaro 17.1.12 Hakoila ██████████████████ ████████ Kernel: x86_64 Linux 4.14.67-1-MANJARO ██████████████████ ████████ Uptime: 3h 12m ████████ ████████ Packages: 1184 ████████ ████████ ████████ Shell: zsh 5.5.1 ████████ ████████ ████████ Resolution: 1920x1080 ████████ ████████ ████████ DE: GNOME ████████ ████████ ████████ WM: GNOME Shell ████████ ████████ ████████ WM Theme: Adapta-Nokto-Maia ████████ ████████ ████████ GTK Theme: Adapta-Nokto-Maia [GTK2/3] ████████ ████████ ████████ Icon Theme: Papirus-Adapta-Maia ████████ ████████ ████████ Font: Noto Sans 11 ████████ ████████ ████████ CPU: Intel Core i7-8550U @ 8x 4GHz [47.0°C] GPU: Mesa DRI Intel(R) UHD Graphics 620 (Kabylake GT2) RAM: 6157MiB / 15928MiB 安装 sudo pacman -S mariadb 配置 #初始化 sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql #启动 sudo systemctl start mariadb #设置密码 mysql_secure_installation

September 9, 2018 · 1 min · 117 words · Jimmy

<Go build web application>的中文翻译版-第三章-连接数据

在上一章中,我们探索了在web应用中如何处理URLS和指引他们转到不同的页面.同时,我们通过net/http中的handle创建了动态的链接和动态的结果. 通过实现和扩展Gorilla toolkit的mux路由,我们通过正则表达式扩展了路由的能力,使其给予我们的应用更大的灵活性. 其实这是一些最流行的web服务器的特性.比如说Apache和Nginx都在路由中提供了方法去解析正则表达式. 但是这仅仅是构成web应用的基石.为了更加深入,我们需要去看看如何引入数据. 前一章的例子中静态文件服务依赖于硬编码,这显然是过时的且难以控制的. 但是幸运的是,从90年代末期开始,网站变得动态化,数据库开始统治世界.虽然APIs,微服务和NoSQL在某些领域替代了这些架构,但是这个架构在当今的Web开发中还是万金油的角色. 所以,事不宜迟,让我们开始获取一些动态数据 在这一章中,我们将学习以下几个主题 连接数据库 使用GUID美化URLs 处理404页面 连接一个数据库 为了连接数据库,Go的SQL接口提供了一个非常简单且可信赖的方式去连接拥有驱动的不同种类的数据库服务器. 目前,大部分流行的数据库都支持-MySQL,Postgres,SQLite,MSSQL和相当多的实现了Go提供的database/sql接口的数据库驱动. Note:在本书中,我们将会把MySQL和Postgres数据库使用最好的实践运用在多个例子上.安装MySQL和Postgres在Nix,Windows,OS X 系统的机器上是相当基础的工作 创建MySQL数据库 你可以选择设计任何你想要的应用,但是在这些例子中,我们将着手一个非常的简单的博客. 我们的目标是尽可能地在数据库中创建一些博客的入口,最好可以使用GUID在数据库中直接地获取数据和展示,如果博客的入口不存在,将展示错误页面. 为了实现这个需求,我们将创建一个包含了我们的页面的MySQL数据库.这个数据库将包含一个整数型的,自动递增的ID,一个全局唯一的标识,或者GUID,还有一些博客的初始数据. 简单起见,我们创建一个叫存储标题的page_title字段,存储页面内容的page_content字段,还有一个使用Unix时间戳的字段page_date. CREATETABLE `pages` ( `id` int(11) unsignedNOT NULL AUTO_INCREMENT, `page_guid` varchar(256)NOT NULLDEFAULT '', `page_title` varchar(256)DEFAULT NULL, `page_content` mediumtext, `page_date`timestampNOT NULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, PRIMARYKEY (`id`), UNIQUEKEY `page_guid` (`page_guid`) )ENGINE=InnoDB AUTO_INCREMENT=2DEFAULTCHARSET=utf-8; 将page_guid标记为UNIQUE_KEY相当重要,如果我们允许出现重复的page_guid,在浏览某个网址的时候可能出现不准确的情况. 我们使用以下的语句插入一些blog数据 INSERTINTO `pages` (`id`, `page_guid`, `page_title`, `page_content`, `page_date`)VALUES (NULL, 'hello-world', 'Hello, World', 'I\'m so glad you found this page! It\'s been sitting patiently on the Internet for some time, just waiting for a visitor.',CURRENT_TIMESTAMP); 执行了上面的语句之后,我们就获得了初始数据 使用下面的代码来获得连接数据库的能力 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log" ) 我们导入MySQL驱动包来完成需求.通常,这意味着驱动是另一个包的实现.你能注意到使用 符号来导入包.你可能已经熟悉这点,作为一种快速且脏的方式去忽略类的实例的返回值.比如说x, :=something() 允许你去忽略第二个返回值.这经常也被开发者用在计划去使用一个库,但是目前还没有用到的情况.通过这种方式准备包,它允许导入声明而不引起编译期报错.虽然这不是推荐的做法,但是在预载入方法中使用下划线_或者空白标识符,好处是这是很常见的做法也普遍被接受. 其实,这全部依赖于你怎样以及为何使用标识符. const ( DBHost = "127.0.0.1" DBPort = ":3306" DBUser = "root" DBPass = "password!" DBDbase = "cms" ) 记得使用你自己的配置去替换以上值 ...

September 22, 2017 · 2 min · 386 words · Jimmy

<Go build web application>的中文翻译版本

目录 模块1:学习Go的Web开发 第一章:介绍和安装Go环境 安装Go 构建一个项目 引入包 介绍net包 你好,Web 本章总结 第二章:服务和路由 直接的文件服务 基本路由 使用Gorilla实现更复杂的路由 转发请求 处理基本的错误 本章总结 第三章:连接数据 连接一个数据库 使用GUID美化URLs 处理404错误 总结 第四章:使用模板 介绍模板,上下文和可视化 HTML模板和文本模板 渲染变量和安全性 使用逻辑和控制结构 本章总结 第五章:使用RESTful APIs进行前端集成 设置基本的API结构 RESTful架构和最佳实践 创建我们的第一个API 实现安全 使用POST创建数据 使用PUT更改数据 本章总结 第六章:Session和Cookies 设置cookies 存储用户的信息 初始化一个服务端的session 本章总结 第七章:微服务和通讯 介绍引入微服务 使用微服务的利弊 理解微服务的内核 微服务之间的通讯 在线上放一个信息 从其他服务读取信息 本章总结 第八章:记录日志和测试 介绍Go中的日志 记录日志到IO中 格式化你的输出 使用panics和fatal errors 介绍Go中的测试 本章总结 第九章:安全 在任何地方使用HTTPS-实现TLS 防止SQL注入 防范XSS攻击 防范CSRF跨站攻击 加密cookies 使用安全中间件 本章总结 第十章:缓存,代理和提高性能 确定瓶颈 实现反向代理 实现缓存 实现HTTP/2 本章总结 模块2:Go 编程蓝皮书 第一章:使用Web Sockets构建的聊天应用 一个简单的Web服务器 在服务器上建模一个聊天室和客户端 构建一个使用HTML和JavaScript的聊天客户端 跟踪代码获取内在的流程 本章总结 第二章:增加权限 拦截所有请求 创建一个社交化的登录页面 动态路径 OAuth2 把你的APP告诉权限提供者 实现额外的登录 本章总结 第三章:3个方法去实现文件缩略图 在权限服务器上的头像 实现Gravatar 上传头像图片 整合3种实现 本章总结 第四章:查询域名的命令行工具 命令行工具的管道设计 5个简单的程序 编写所有5个程序 本章总结 第五章:构建分布式系统,与复杂的数据交互 系统设计 安装环境 获取Twitter的投票 计算投票 运行我们的解决方案 本章总结 第六章:通过RESTful web数据接口对外提供数据和功能 RESTful API 设计 在处理器间共享数据 包装处理函数 响应 理解请求 一个简单的主函数去处理我们的API 处理节点 一个web客户端去消费API 运行解决方案 本章总结 第七章:随机推荐Web服务 项目预览 用代码展示数据 构造随机推荐 本章总结 第八章:文件备份系统 解决方案设计 备份包 用户命令行工具 备份守护工具 测试解决方案 本章总结 模块3:精通Go的高并发 第一章:介绍Go并发编程 介绍协程 实现延迟控制机制 理解协程与协同 实现通道 关闭与协程 构建一个使用协程和通道的爬虫 本章总结 第二章:理解并发模型 理解协程如何工作 同步和异步协程 可视化并发 RSS实战 CSP的一点介绍 Go和角色模型 面向对象 使用并发 管理线程 使用同步和互斥锁住数据 本章总结 第三章:开发并行策略 在复杂的并发中提高效率 使用竞争检查识别竞争条件 同步我们的并发操作 项目-多用户预约日历 一个多用户预约日历 风格说明 不变性说明 本章总结 第四章:应用中的数据完整性 深入理解互斥与同步 协程的代价 处理文件 更底层-实现C 分布式的Go 几种常见的一致性模型 使用memcached 本章总结 第五章:锁,区块和更好的通道 理解Go中的区块方法 清除协程 创建通道的通道 Pprof-一个令人惊叹的工具 处理死锁和错误 本章总结 第六章:C10K-Go中的一个无锁的Web服务器 攻克C10K问题 创建我们的C10K Web服务器 提供页面服务 多线程和利用多核 探索我们的Web服务器 本章总结 第七章:性能与可扩展性 Go的高性能 使用App Engine 分布式的Go 一些有用的库 内存维护 本章总结 第八章:并发程序架构 设计我们的并发程序 确定我们的需求 在Go中使用NoSQL作为数据存储 监控文件系统的变化 管理日志文件 处理配置文件 检测文件变化 备份文件 设计Web接口 还原文件的历史-命令行 检查服务器的健康度 本章总结 第九章:在Go中记录日志和测试并发 处理错误和记录日志 使用log4go包作为健壮的日志组件 使用runtime包作为细粒度的堆栈跟踪组件 本章总结 第十章:先进的并发和最佳实践 使用channels跨越基础 构建工作者 实现空通道区块 使用tomb实现对协程更多的细粒度的控制 使用通道定时 通过并发模式构建负载均衡器 选择单向和双向通道 使用泛型通道 使用Go的单元测试 使用Google的App Engine 使用最佳实践 本章总结

September 20, 2017 · 2 min · 226 words · Jimmy