- 日志分析
- 运维观测
【免费下载链接】graylog2-server
Free and open log management
本指南围绕 graylog2-server 仓库中的插件开发脚手架 graylog-plugin-archetype 展开,系统讲解如何用它一键生成 Graylog 插件工程、理解脚手架生成的源码骨架,以及完成构建、打包、安装与发布的完整流程。读完本文,你将掌握mvn archetype:generate的完整用法、插件 JAR 的安装方式、web 界面热重载开发技巧,以及基于 Maven release plugin 的版本发布流程。
一、插件骨架的定位与组成
Graylog 是开源的集中式日志管理系统,其可扩展性通过插件机制实现。graylog-plugin-archetype是官方提供的 Maven 原型(archetype),用于快速生成符合 Graylog 插件规范的标准工程结构。它的打包类型是maven-archetype,版本跟随 graylog2-server 主仓库演进(本仓库当前为7.2.0-SNAPSHOT,见 graylog-plugin-archetype/pom.xml)。
整个脚手架的模板资源位于graylog-plugin-archetype/src/main/resources/archetype-resources/,由 archetype-metadata.xml 描述其文件组成:
- Java 源码模板:
src/main/java/__pluginClassName__.java等四个核心类文件(占位符__pluginClassName__会在生成时被替换为用户输入的主类名); - 插件注册资源:
src/main/resources/META-INF/services/org.graylog2.plugin.Plugin与graylog-plugin.properties属性文件; - web 前端骨架:
src/web/index.jsx、webpack.config.js、build.config.js、package.json; - 打包辅助文件:
src/deb/control/control(DEB 打包控制文件)、.gitignore、.mvn/jvm.config; - 说明文档:
README.md与GETTING-STARTED.md。
该元数据同时定义了五个必填属性(requiredProperties),是生成插件时必须提供的参数:
| 属性 | 默认值 | 含义 |
|---|---|---|
pluginClassName | 无 | 插件主类类名(如Twitter),将替换模板中的__pluginClassName__占位符 |
version | 1.0.0-SNAPSHOT | 插件版本号 |
githubRepo | 无 | 托管插件代码的 GitHub 仓库(用于填充 SCM 与下载链接) |
ownerName/ownerEmail | 无 | 插件作者信息(写入 pom 的 developers 与前端 package.json) |
serverCheckoutPath | ../graylog2-server | 本地 graylog2-server 仓库的相对路径(用于构建 web 部分) |
二、用 Archetype 生成新插件工程
2.1 基础生成命令
最简单的生成方式是从远程 Maven 仓库拉取 archetype:
mvn archetype:generate -DarchetypeGroupId=org.graylog -DarchetypeArtifactId=graylog-plugin-archetype运行后会进入交互模式,依次提示输入groupId、artifactId、package、pluginClassName等属性。完整的交互过程示例如下:
$ mvn archetype:generate -DarchetypeGroupId=org.graylog -DarchetypeArtifactId=graylog-plugin-archetype [...] [INFO] Generating project in Interactive mode [INFO] Archetype [org.graylog:graylog-plugin-archetype:1.0.1] found in catalog remote Define value for property 'groupId': : org.graylog.plugins Define value for property 'artifactId': : graylog-plugin-twitter [INFO] Using property: version = 1.0.0-SNAPSHOT Define value for property 'package': org.graylog.plugins: : org.graylog.plugins.twitter Define value for property 'pluginClassName': : : Twitter Confirm properties configuration: groupId: org.graylog.plugins artifactId: graylog-plugin-twitter version: 1.0.0-SNAPSHOT package: org.graylog.plugins.twitter pluginClassName: Twitter Y: : y [INFO] Using following parameters for creating project from Archetype: graylog-plugin-archetype:1.0.1 [...] [INFO] Parameter: packageInPathFormat, Value: org/graylog/plugins/twitter [...] [INFO] project created from Archetype in dir: /home/bernd/foo/graylog-plugin-twitter [INFO] BUILD SUCCESS注意两点:version不一定会被交互询问,默认取1.0.0-SNAPSHOT;pluginClassName只需要填类名的简单名称(如Twitter),骨架会自动把它拼接成TwitterPlugin、TwitterMetaData、TwitterModule等完整的类。
2.2 使用本地安装的 Archetype
如果你想修改骨架本身再生成插件,可以克隆本仓库并先把 archetype 安装到本地 Maven 仓库:
mvn install之后生成时加上-DarchetypeCatalog=local,强制从本地 catalog 取用,避免 Maven 去远程仓库(如 Maven Central)拉取同名但版本不同的 archetype:
mvn archetype:generate -DarchetypeGroupId=org.graylog -DarchetypeArtifactId=graylog-plugin-archetype -DarchetypeCatalog=local2.3 生成的插件工程结构
以示例groupId=org.graylog.plugins、artifactId=graylog-plugin-twitter、package=org.graylog.plugins.twitter、pluginClassName=Twitter为例,生成后的目录大致为:
graylog-plugin-twitter/ ├── pom.xml # 以 graylog-plugin-web-parent 为父工程的 Maven 配置 ├── README.md # 插件介绍与安装说明(模板自带) ├── GETTING-STARTED.md # 引导文档 ├── package.json # web 部分 npm 脚本与依赖 ├── webpack.config.js ├── build.config.js └── src/ ├── main/java/org/graylog/plugins/twitter/ │ ├── TwitterPlugin.java │ ├── TwitterMetaData.java │ ├── TwitterModule.java │ └── Twitter.java ├── main/resources/ │ ├── META-INF/services/org.graylog2.plugin.Plugin │ └── org.graylog.plugins.twitter/graylog-plugin.properties ├── deb/control/control └── web/index.jsx模板中的所有__pluginClassName__占位符都会被替换成Twitter,${groupId}、${artifactId}等变量则由 Maven 替换为实际值(参见 archetype-metadata.xml 中对各 fileSet 的filtered="true"设置)。
三、生成的源码骨架与插件加载原理
3.1 四个核心 Java 类
脚手架生成的 Java 部分遵循 Graylog 的PluginSPI(Service Provider Interface)设计,四个类各司其职:
① 插件入口TwitterPlugin.java—— 实现org.graylog2.plugin.Plugin接口,将元数据与模块装配给 Graylog:
public class TwitterPlugin implements Plugin { @Override public PluginMetaData metadata() { return new TwitterMetaData(); } @Override public Collection<PluginModule> modules() { return Collections.<PluginModule>singletonList(new TwitterModule()); } }该接口定义于 graylog2-server/src/main/java/org/graylog2/plugin/Plugin.java,是 Graylog 服务器加载插件时统一识别并调用的唯一入口。
② 元数据TwitterMetaData.java—— 提供插件的名称、描述、作者、版本、所需 Graylog 最低版本等展示性信息,供服务器在启动日志与系统信息中显示。
③ 模块TwitterModule.java—— 继承 Guice 的AbstractModule,用于绑定插件自定义的输入、输出、报警条件等组件,是插件功能的实际装配点。
④ 主类Twitter.java—— 插件自身业务逻辑的容器,模板仅保留类骨架,实际功能(如新的 input/output 类型)需要开发者在此填充。
3.2 插件的注册与服务发现
Graylog 通过 Java 的 SPI 机制发现插件:生成工程中会自动创建src/main/resources/META-INF/services/org.graylog2.plugin.Plugin文件,其内容指向生成的插件入口类。服务器启动时扫描该文件并实例化插件。同时,maven-shade-plugin 使用ServicesResourceTransformer将服务描述符合并进最终 JAR,确保插件打包后注册信息完整。
3.3 graylog-plugin.properties 与类加载隔离
骨架还会生成graylog-plugin.properties属性文件,控制插件运行时行为:
# The plugin version version=${project.version} # The required Graylog server version graylog.version=${graylog.version} # When set to true (the default) the plugin gets a separate class loader # when loading the plugin. When set to false, the plugin shares a class loader # with other plugins that have isolated=false. # # Do not disable this unless this plugin depends on another plugin! isolated=true其中isolated=true(默认)表示该插件使用独立的类加载器加载,避免与其他插件发生类冲突;graylog.version声明所需的最低服务器版本,与 README 中"Required Graylog version"的说明相呼应。
四、构建、打包与安装插件
4.1 构建 JAR
生成后的插件工程基于 Maven 3 构建,需要Java 8 或更高版本。执行:
mvn package构建流程说明(对应 生成的 pom.xml):
- 父工程为
graylog-plugin-web-parent,插件默认不部署到 Maven 仓库(maven.deploy.skip=true); - 依赖
org.graylog2:graylog2-server及其 test-jar,scope=provided,即编译期可用、运行时由服务器提供; web-interface-buildprofile 默认激活(除非传入-Dskip.web.build),会通过frontend-maven-plugin自动安装指定版本的 Node 与 Yarn,执行yarn install和yarn run build将前端src/web/index.jsx构建成静态资源打进 JAR;maven-shade-plugin在 package 阶段将依赖与插件资源合并,产出可直接放入服务器插件目录的最终 JAR。
生成的 JAR 位于target/目录,文件名形如graylog-plugin-twitter-1.0.0-SNAPSHOT.jar。
4.2 构建 DEB / RPM 系统包(可选)
骨架预配置了 jdeb 与 rpm-maven-plugin,可一键产出系统安装包:
mvn jdeb:jdeb # 生成 .deb 包 mvn rpm:rpm # 生成 .rpm 包生成的.deb包会把插件 JAR 安装到/usr/share/graylog-server/plugin目录(对应 pom 中graylog.plugin-dir属性,见 生成的 pom.xml),并设置 644 文件权限、root 属主。
4.3 安装到 Graylog 服务器
安装步骤(即生成模板 README 的核心流程):
- 下载/构建插件,得到
.jar文件; - 将
.jar放入 Graylog 插件目录。默认插件目录是相对graylog-server目录下的plugins/文件夹,也可以在graylog.conf中配置; - 重启
graylog-server即可生效。
插件目录配置项的源码依据:服务器端通过 PluginPathConfiguration.java 解析plugin_dir配置参数(@Parameter(value = "plugin_dir", required = true)),其默认值为相对路径plugin(即相对服务器启动目录的plugin/目录,对应源码中DEFAULT_PLUGIN_DIR = Paths.get("plugin"))。该配置被 PluginLoaderConfig 继承,最终由CmdLineTool通过new PluginLoader(pluginLoaderConfig.getPluginDir().toFile(), classLoader)(见 CmdLineTool.java)加载目录下的所有插件 JAR。因此安装时只需保证plugin_dir指向的目录内存在插件 JAR,重启后即可被自动加载。
五、Web 界面部分的热重载开发
如果插件包含 web 前端组件(如自定义输入/输出的前端页面),直接mvn package反复构建会拖慢迭代速度。骨架 README 提供了利用 webpack dev server 热重载的开发方案,前提是本地已有 graylog2-server 源码树:
git clone https://github.com/Graylog2/graylog2-server.git cd graylog2-server/graylog2-web-interface ln -s $YOURPLUGIN plugin/ npm install && npm start具体说明:
ln -s $YOURPLUGIN plugin/把插件工程软链接到 web 前端目录下的plugin/位置,webpack 配置会将其识别为本地插件源码(生成工程根目录的 webpack.config.js 与 build.config.js 中的web_src_path即指向graylog2-web-interface,两者配合即可将插件src/web/index.jsx纳入 dev server 的编译范围);npm install && npm start启动 web 开发服务器,前端改动即时生效,无需重启 Graylog 服务器,可显著提升 UI 部分开发体验。
六、插件发布与版本管理
骨架工程内置了 Maven release plugin 配置,官方推荐的发布流程为:
mvn release:prepare [...] mvn release:performrelease:prepare会依次完成:检查无未提交代码、设置发布版本号、执行clean test验证、在 SCM(生成 pom 中配置的 GitHub 仓库地址)创建版本 tag 并推进开发版本号;release:perform则从该 tag 检出代码执行发布构建(goals=package),产出可发布的 JAR 与系统包。相关配置位于 生成的 pom.xml(autoVersionSubmodules=true、mavenExecutorId=forked-path、tagNameFormat=@{project.version})。
发布前记得在生成时正确填写githubRepo属性,它会写入 pom 的 SCM 配置(scm:git:git@github.com:${githubRepo}.git)以及 README 中的下载链接占位符。
七、使用插件模板 README 维护插件文档
生成工程的README.md同样由模板生成(即 archetype-resources/README.md),包含几个需要插件作者替换/完善的占位段落:
# ${pluginClassName} Plugin for Graylog—— 标题中的${pluginClassName}已被替换为实际类名;__Use this paragraph to enter a description of your plugin.__—— 替换为插件功能描述;- Required Graylog version—— 标记所需的最低服务器版本(模板默认
2.0 and later,若用isolated=true等较新机制应如实调整); - Installation章节 —— 说明下载 JAR 并放入插件目录、重启
graylog-server的安装流程; - Usage章节 —— 记录插件使用方法;
- Development章节 —— 保留热重载开发指引;
- Getting started章节 —— 保留 Maven 3 / Java 8+ 的构建要求与
mvn package、mvn jdeb:jdeb、mvn rpm:rpm等命令; - Plugin Release章节 —— 保留
mvn release:prepare/mvn release:perform发布流程。
这些段落可直接作为插件项目 README 的基础,只需按实际情况替换占位内容即可形成完整的插件文档。
八、常见问题与排查建议
- 生成本地 archetype 时拉到远程版本:本地修改骨架后必须用
-DarchetypeCatalog=local,否则 Maven 会优先匹配远程 catalog; - 插件未在服务器加载:检查 JAR 是否位于
plugin_dir指向的目录(默认相对服务器的plugin/),并确认META-INF/services/org.graylog2.plugin.Plugin文件内容与插件入口类完全一致(含全限定类名);查看服务器启动日志中关于插件加载的输出; - web 构建失败或网络问题:web-interface-build profile 会下载固定版本的 Node/Yarn,网络受限时可使用
mvn package -Dskip.web.build跳过前端构建,仅编译 Java 部分; - 版本兼容性:
graylog-plugin.properties中的graylog.version应与你部署的服务器版本匹配;生成的 pom 父工程版本与服务器源码版本需保持一致,构建前可通过serverCheckoutPath指向本地服务器源码树来对齐依赖版本。
结语
Graylog 插件 Maven Archetype 将"建工程—写逻辑—打 JAR—装插件—发版本"的全流程固化成了标准化的脚手架。配合本仓库中 archetype-metadata.xml、模板 pom.xml 以及服务器端的 PluginPathConfiguration.java 等实现文件,开发者可以清楚理解插件从生成到被 Graylog 加载的每一个环节,从而专注于插件本身的功能开发。
- 日志分析
- 运维观测
【免费下载链接】graylog2-server
Free and open log management
相关推荐
国家中小学智慧教育平台电子课本下载工具:3 步完成课本 PDF 本地保存
国家中小学智慧教育平台电子课本下载工具:3 步完成课本 PDF 本地保存 国家中小学智慧教育平台上的电子课本只能在线预览,平台本身不提供下载入口。tchMate
网页爬虫教育Joplin 插件开发完全指南:从 Yeoman 脚手架到插件仓库发布
Joplin 插件开发完全指南:从 Yeoman 脚手架到插件仓库发布 Joplin 是面向隐私的笔记应用,其插件体系允许开发者通过一套基于 TypeScrip
知识管理跨平台插件系统基于 snapdom-plugin-template 开发 SnapDOM v3 插件:从脚手架到发布完整指南
基于 snapdom plugin template 开发 SnapDOM v3 插件:从脚手架到发布完整指南 本指南以仓库中的 插件模板说明 https://
前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考