https://github.com/olegiv/logwatch-ai-go
Logwatch AI Analyzer - An automated system that analyzes Logwatch and Drupal Watchdog reports using Claude AI and sends summarized insights via Telegram channel.
https://github.com/olegiv/logwatch-ai-go
ai analysis analyzer claude claude-ai claude-api claude-code drupal drush go golang jq llama3 log logger logging logwatch ollama telegram watchdog
Last synced: 3 months ago
JSON representation
Logwatch AI Analyzer - An automated system that analyzes Logwatch and Drupal Watchdog reports using Claude AI and sends summarized insights via Telegram channel.
- Host: GitHub
- URL: https://github.com/olegiv/logwatch-ai-go
- Owner: olegiv
- License: gpl-3.0
- Created: 2025-11-12T19:41:20.000Z (9 months ago)
- Default Branch: master
- Last Pushed: 2026-04-20T11:32:27.000Z (3 months ago)
- Last Synced: 2026-04-20T13:36:22.536Z (3 months ago)
- Topics: ai, analysis, analyzer, claude, claude-ai, claude-api, claude-code, drupal, drush, go, golang, jq, llama3, log, logger, logging, logwatch, ollama, telegram, watchdog
- Language: Go
- Homepage:
- Size: 466 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Agents: AGENTS.md
Awesome Lists containing this project
README
# Logwatch AI Analyzer (Go)
[](https://github.com/olegiv/logwatch-ai-go/actions/workflows/go.yml)
[](https://github.com/olegiv/logwatch-ai-go/actions/workflows/github-code-scanning/codeql)
[](https://github.com/olegiv/logwatch-ai-go/actions/workflows/dependency-review.yml)
An intelligent log analyzer that uses LLM (Large Language Models) to analyze log reports and send actionable insights via Telegram. This is a Go port of the original Node.js [logwatch-ai](https://github.com/olegiv/logwatch-ai) project.
**Supported Log Sources:**
- **Logwatch** - Linux system log aggregation (syslog, auth, mail, etc.)
- **Drupal Watchdog** - PHP/Drupal application logs (JSON or drush export)
**Supported LLM Providers:**
- **Anthropic Claude** - Cloud-based AI (Claude Haiku 4.5 default; Sonnet 4.6 and Opus 4.7 supported)
- **Ollama** - Local LLM inference for privacy and zero-cost operation
- **LM Studio** - Local LLM inference with user-friendly GUI
## Features
- **AI-Powered Analysis**: Uses LLM to analyze log reports (Claude AI or local models)
- **Multiple LLM Providers**: Choose between Anthropic Claude (cloud), Ollama (local), or LM Studio (local)
- **Multi-Source Support**: Analyze Logwatch reports or Drupal watchdog logs
- **Smart Notifications**: Dual-channel Telegram notifications (archive + alerts)
- **Historical Tracking**: SQLite database stores analysis history for trend detection
- **Intelligent Preprocessing**: Handles large log files (up to 800KB-1MB) with smart content reduction
- **Cost Optimization**: Implements Claude prompt caching (16-30% cost savings)
- **Proxy Support**: Full HTTP/HTTPS proxy support for corporate environments
- **Secure Logging**: Automatic credential sanitization prevents API keys from appearing in logs
- **Rate Limiting**: Telegram API rate limiting with exponential backoff retry
- **Prompt Injection Protection**: Input sanitization filters adversarial content from logs
- **Pure Go**: No CGO dependencies, easy cross-platform deployment
## Quick Start
### Prerequisites
- Go 1.25+ (for building from source)
- Logwatch installed and configured
- **LLM Provider** (choose one):
- Anthropic API key (for cloud-based Claude AI), OR
- Ollama installed locally (for free local inference), OR
- LM Studio installed locally (for free local inference with GUI)
- Telegram bot token and channel IDs
### Installation
1. **Clone the repository**
```bash
git clone --recurse-submodules https://github.com/olegiv/logwatch-ai-go.git
cd logwatch-ai-go
# If already cloned without --recurse-submodules:
git submodule update --init --recursive
# Update submodule to latest version:
git submodule update --remote --merge
```
2. **Build the local/dev binary**
```bash
make build
```
3. **Configure environment**
```bash
cp configs/.env.example .env
# Edit .env with your credentials
```
4. **Install system-wide** (optional)
```bash
sudo make install
```
### Configuration
Create a `.env` file with the following settings:
```bash
# LLM Provider Selection
# Options: "anthropic" (default), "ollama", or "lmstudio"
LLM_PROVIDER=anthropic
# Anthropic/Claude Configuration (used when LLM_PROVIDER=anthropic)
ANTHROPIC_API_KEY=sk-ant-xxxxx
CLAUDE_MODEL=claude-haiku-4-5-20251001
# Ollama Configuration (used when LLM_PROVIDER=ollama)
# Requires Ollama running locally: https://ollama.ai
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.3:latest
# LM Studio Configuration (used when LLM_PROVIDER=lmstudio)
# Requires LM Studio running locally: https://lmstudio.ai
# See "LM Studio Setup" section for recommended models
LMSTUDIO_BASE_URL=http://localhost:1234
LMSTUDIO_MODEL=local-model
# AI Settings (applies to all providers)
AI_TIMEOUT_SECONDS=120
AI_MAX_TOKENS=8000
# Telegram
TELEGRAM_BOT_TOKEN=1234567890:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
TELEGRAM_CHANNEL_ARCHIVE_ID=-1001234567890 # Required
TELEGRAM_CHANNEL_ALERTS_ID=-1009876543210 # Optional
# Log Source Configuration
# Options: "logwatch" (default), "drupal_watchdog", or "ocms"
LOG_SOURCE_TYPE=logwatch
# Logwatch Configuration (used when LOG_SOURCE_TYPE=logwatch)
LOGWATCH_OUTPUT_PATH=/tmp/logwatch-output.txt
# OCMS Configuration (used when LOG_SOURCE_TYPE=ocms)
# Single-site mode uses OCMS_LOGS_PATH directly.
# Multi-site mode uses ocms-sites.json with log kinds: main, error, or all.
OCMS_LOGS_PATH=/tmp/ocms.log
# Drupal Watchdog Configuration (used when LOG_SOURCE_TYPE=drupal_watchdog)
# Configure in drupal-sites.json (see configs/drupal-sites.json.example)
# Common Log Settings
MAX_LOG_SIZE_MB=10
# Application
LOG_LEVEL=info
ENABLE_DATABASE=true
DATABASE_PATH=./data/summaries.db
# Preprocessing
ENABLE_PREPROCESSING=true
MAX_PREPROCESSING_TOKENS=150000
# Proxy (optional)
HTTP_PROXY=http://proxy.example.com:8080
HTTPS_PROXY=http://proxy.example.com:8080
```
### Setting up Telegram
1. **Create a Telegram bot**:
- Message [@BotFather](https://t.me/BotFather)
- Send `/newbot` and follow the instructions
- Save the bot token
2. **Create Telegram channel(s)**:
- Create a channel for archives
- (Optional) Create a separate channel for alerts
- Add your bot as an administrator to both channels
3. **Get channel IDs**:
- Forward a message from your channel to [@userinfobot](https://t.me/userinfobot)
- The bot will reply with the channel ID (should start with `-100`)
### Ollama Setup (Optional)
For free local inference without cloud API costs, you can use Ollama:
1. **Install Ollama**:
```bash
# macOS
brew install ollama
# Linux
curl -fsSL https://ollama.ai/install.sh | sh
```
2. **Pull a model** (recommended for systems with 64GB+ RAM):
```bash
# Best quality for log analysis (requires ~40GB RAM)
ollama pull llama3.3:latest
# Alternative for lower-RAM systems
ollama pull llama3.2:8b
```
3. **Start Ollama server**:
```bash
ollama serve
```
4. **Configure in `.env`**:
```bash
LLM_PROVIDER=ollama
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.3:latest
```
**Recommended Models:**
| Model | RAM Required | Quality | Speed |
|-------|-------------|---------|-------|
| `llama3.3:latest` | ~45GB | Excellent | Slower |
| `qwen2.5:72b` | ~45GB | Excellent | Slower |
| `deepseek-coder-v2:33b` | ~20GB | Good | Faster |
| `llama3.2:8b` | ~5GB | Acceptable | Fast |
**Trade-offs vs Claude:**
- ✅ Zero cost - unlimited analysis
- ✅ Data privacy - logs never leave your machine
- ✅ No rate limits or API quotas
- ⚠️ Slower than cloud (depends on hardware)
- ⚠️ Quality varies by model (larger models = better)
- ⚠️ Requires powerful hardware for best results
### LM Studio Setup (Optional)
LM Studio provides a user-friendly desktop application for running local LLMs:
1. **Download and install LM Studio** from https://lmstudio.ai
2. **Load a model** in LM Studio:
- Open LM Studio
- Browse and download a model (e.g., Llama 3.3, Mistral, Qwen)
- Click "Load" to load the model into memory
3. **Enable Local Server**:
- Click on "Local Server" in the left sidebar
- Click "Start Server" (default port: 1234)
4. **Configure in `.env`**:
```bash
LLM_PROVIDER=lmstudio
LMSTUDIO_BASE_URL=http://localhost:1234
LMSTUDIO_MODEL=local-model
```
**Note:** The `local-model` identifier uses whatever model is currently loaded in LM Studio. You can also specify a specific model name if multiple models are loaded.
**Recommended Models:**
| Model | VRAM Required | Quality | Speed |
|-------|---------------|---------|-------|
| Llama-3.3-70B-Instruct | ~40GB | Excellent | Slower |
| Qwen2.5-32B-Instruct | ~20GB | Excellent | Medium |
| Mistral-Small-24B-Instruct | ~15GB | Good | Medium |
| Phi-4-14B | ~9GB | Good | Faster |
| Llama-3.2-8B-Instruct | ~5GB | Acceptable | Fast |
**Tips for model selection:**
- Download models from LM Studio's built-in model browser (Search tab)
- Look for GGUF quantized versions (Q4_K_M or Q5_K_M) for better VRAM efficiency
- For Apple Silicon Macs, models run on unified memory (RAM = VRAM)
- Start with a smaller model to test, then upgrade for better quality
**Trade-offs vs Claude:**
- ✅ Zero cost - unlimited analysis
- ✅ Data privacy - logs never leave your machine
- ✅ User-friendly GUI for model management
- ✅ Easy model switching without CLI commands
- ✅ OpenAI-compatible API
- ⚠️ Slower than cloud (depends on hardware)
- ⚠️ Quality varies by model
- ⚠️ Requires powerful hardware for large models
### Cron Setup
Run logwatch analysis daily at 2:00 AM:
**Root crontab** (generate logwatch report):
```bash
0 2 * * * /opt/logwatch-ai/scripts/generate-logwatch.sh
```
**User crontab** (run analyzer):
```bash
15 2 * * * cd /opt/logwatch-ai && ./logwatch-analyzer >> logs/cron.log 2>&1
```
See [docs/CRON_SETUP.md](docs/CRON_SETUP.md) for detailed setup instructions.
### Drupal Watchdog Setup
To analyze Drupal watchdog logs instead of logwatch:
**Prerequisites:**
- `jq` installed (required for multi-site configuration parsing)
- Debian/Ubuntu: `apt-get install jq`
- macOS: `brew install jq` or `port install jq`
- drush installed in Drupal project
1. **Configure drupal-sites.json** (see `configs/drupal-sites.json.example`):
```json
{
"version": "1.0",
"default_site": "production",
"sites": {
"production": {
"name": "Production Site",
"drupal_root": "/var/www/html",
"watchdog_path": "/var/log/drupal-watchdog.json",
"watchdog_format": "json",
"min_severity": 3,
"watchdog_limit": 100
}
}
}
```
2. **Set up cron jobs**:
```bash
# Export watchdog logs daily at 2:00 AM
0 2 * * * /opt/logwatch-ai/scripts/generate-drupal-watchdog.sh --site production
# Run analyzer at 2:15 AM
15 2 * * * cd /opt/logwatch-ai && ./logwatch-analyzer -source-type drupal_watchdog -drupal-site production >> logs/cron.log 2>&1
```
**Drupal Watchdog JSON Format:**
```json
[
{
"wid": 1234,
"uid": 1,
"type": "php",
"message": "PDOException: SQLSTATE[HY000] [2002] Connection refused",
"variables": "a:0:{}",
"severity": 3,
"link": "",
"location": "https://example.com/",
"referer": "",
"hostname": "127.0.0.1",
"timestamp": 1699900800
}
]
```
### Multi-Site Drupal Support
For organizations managing multiple Drupal sites, the analyzer supports a centralized configuration file.
1. **Create `drupal-sites.json`** (search locations: `./`, `./configs/`, `/opt/logwatch-ai/`):
```json
{
"version": "1.0",
"default_site": "production",
"sites": {
"production": {
"name": "Production Site",
"drupal_root": "/var/www/production/drupal",
"watchdog_path": "/var/log/drupal/production-watchdog.json",
"watchdog_format": "json",
"min_severity": 3,
"watchdog_limit": 100
},
"staging": {
"name": "Staging Site",
"drupal_root": "/var/www/staging/drupal",
"watchdog_path": "/var/log/drupal/staging-watchdog.json",
"watchdog_format": "json",
"min_severity": 4,
"watchdog_limit": 200
}
}
}
```
2. **List available sites**:
```bash
# Analyzer
./logwatch-analyzer -list-drupal-sites
# Export script
./scripts/generate-drupal-watchdog.sh --list-sites
```
3. **Analyze a specific site**:
```bash
./logwatch-analyzer -source-type drupal_watchdog -drupal-site production
```
4. **Export watchdog for a specific site**:
```bash
./scripts/generate-drupal-watchdog.sh --site production
```
5. **Automated multi-site cron** (analyze all sites daily):
```bash
# Export watchdog for each site at 2:00 AM
0 2 * * * /opt/logwatch-ai/scripts/generate-drupal-watchdog.sh --site production
5 2 * * * /opt/logwatch-ai/scripts/generate-drupal-watchdog.sh --site staging
# Analyze each site at 2:15 AM
15 2 * * * cd /opt/logwatch-ai && ./logwatch-analyzer -drupal-site production >> logs/cron.log 2>&1
20 2 * * * cd /opt/logwatch-ai && ./logwatch-analyzer -drupal-site staging >> logs/cron.log 2>&1
```
**Site Configuration Fields:**
| Field | Required | Description |
|-------|----------|-------------|
| `name` | No | Human-readable site name for reports |
| `drupal_root` | Yes | Path to Drupal installation root |
| `watchdog_path` | Yes | Path to watchdog export file |
| `watchdog_format` | No | `json` (default) or `drush` |
| `min_severity` | No | RFC 5424 severity level 0-7 (default: 3=error) |
| `watchdog_limit` | No | Max entries in output (default: 100) |
### Multi-Site OCMS Support
For OCMS multi-site analysis, use `ocms-sites.json` for logwatch-ai site
selection and `/etc/ocms/sites.conf` as the external OCMS registry. Do not put
per-site log paths in JSON; the analyzer derives them from the registry
`INSTANCE_DIR`.
```json
{
"version": "1.0",
"default_site": "example_com",
"registry_path": "/etc/ocms/sites.conf",
"default_log_kind": "main",
"sites": {
"example_com": {
"name": "Example Site"
},
"app_example_com": {
"name": "Example App",
"log_kind": "all"
},
"blog_example_com": {
"name": "Example Blog",
"log_kind": "error"
}
}
}
```
Derived OCMS logs:
- `main`: `/logs/ocms.log`
- `error`: `/logs/error.log`
- `all`: both files above, read in that order and analyzed in one report
**OCMS Configuration Fields:**
| Field | Required | Description |
|-------|----------|-------------|
| `version` | Yes | Config schema version. Use `"1.0"`. |
| `default_site` | No | Default OCMS site ID from `sites` when `-ocms-site` is not provided. |
| `registry_path` | No | External OCMS registry path. Defaults to `/etc/ocms/sites.conf`. |
| `default_log_kind` | No | Default log kind for sites without `sites..log_kind`. Allowed: `main`, `error`, `all`. Defaults to `main`. |
| `sites` | Yes | Map keyed by OCMS site ID. IDs must exist in `/etc/ocms/sites.conf`. |
| `sites..name` | No | Human-readable site name for reports. |
| `sites..log_kind` | No | Per-site log kind override. Allowed: `main`, `error`, `all`. |
Log-kind precedence: CLI `-ocms-log-kind`, then `sites..log_kind`, then
`default_log_kind`, then built-in default `main`.
## Usage
### Manual Run
```bash
# From the project directory
./bin/logwatch-analyzer
# Or if installed system-wide
logwatch-analyzer
```
### Command-Line Options
```bash
./logwatch-analyzer [options]
Options:
-source-type string Log source type: logwatch, drupal_watchdog, ocms
-source-path string Path to log source file (overrides env config)
-drupal-site string Drupal site ID from drupal-sites.json
-drupal-sites-config string Path to drupal-sites.json configuration file
-list-drupal-sites List available Drupal sites and exit
-ocms-site string OCMS site ID from ocms-sites.json
-ocms-sites-config string Path to ocms-sites.json configuration file
-ocms-log-kind string OCMS log kind: main, error, or all
-list-ocms-sites List available OCMS sites and exit
-h, -help Show usage information
-v, -version Show version information
```
**Examples:**
```bash
# Analyze logwatch with default config
./logwatch-analyzer
# Override source type
./logwatch-analyzer -source-type drupal_watchdog
# Analyze OCMS site logs
./logwatch-analyzer -source-type ocms -ocms-site example_com
# Analyze both OCMS main and error logs in one report
./logwatch-analyzer -source-type ocms -ocms-site example_com -ocms-log-kind all
# List OCMS sites and derived log paths
./logwatch-analyzer -list-ocms-sites
# Analyze specific Drupal site
./logwatch-analyzer -drupal-site production
# Use custom watchdog file
./logwatch-analyzer -source-type drupal_watchdog -source-path /tmp/custom-watchdog.json
# List available Drupal sites
./logwatch-analyzer -list-drupal-sites
```
### Build Options
```bash
make build # Fast local/dev build
make build-prod # Optimized host production build
make build-linux-amd64 # Optimized static Linux AMD64 production build
make build-darwin-arm64 # Optimized Darwin ARM64 production build
make build-all-platforms # Linux AMD64 + Darwin ARM64 production builds
make test # Run tests
make test-race # Run tests with race detector
make coverage # Run tests with coverage summary
make coverage-html # Write coverage.out + coverage.html
make fmt # Format with gofumpt
make fmt-check # Fail if gofumpt would reformat files
make vet # Run go vet
make lint # Run all linters
make check # fmt-check + vet + lint + test
make deps # Download Go module dependencies
make tidy # Tidy Go modules
make install-tools # Install pinned developer tools
make help # Show Makefile targets
make clean # Clean build artifacts
make install # Install to /opt/logwatch-ai
```
### Cross-Platform Builds
Go's built-in cross-compilation makes it easy to build for different platforms:
**Linux AMD64** (Debian 12, Ubuntu 24, most Linux distributions):
```bash
make build-linux-amd64
# Output: bin/logwatch-analyzer-linux-amd64
```
**macOS ARM64** (Apple Silicon - M1, M2, M3):
```bash
make build-darwin-arm64
# Output: bin/logwatch-analyzer-darwin-arm64
```
**All platforms at once**:
```bash
make build-all-platforms
# Outputs both binaries and shows file sizes
```
All cross-platform builds include production optimizations:
- `-ldflags="-s -w"` - Strips symbols and debug information
- `-trimpath` - Removes file system paths from binary
- Result: Smaller binaries (~20-40% size reduction) and improved security
## Architecture
### Project Structure
```
logwatch-ai-go/
├── cmd/
│ └── analyzer/ # Main application entry point
├── internal/
│ ├── ai/ # Claude AI client and prompts
│ ├── analyzer/ # Multi-source abstraction (interfaces)
│ ├── config/ # Configuration management
│ ├── drupal/ # Drupal watchdog reader and prompts
│ ├── errors/ # Error sanitization (credential redaction)
│ ├── logging/ # Secure logger (credential filtering)
│ ├── logwatch/ # Logwatch file reading and preprocessing
│ ├── ocms/ # OCMS log reader, prompt, and preprocessing adapters
│ ├── notification/ # Telegram notifications
│ └── storage/ # SQLite database operations
├── scripts/ # Helper scripts
├── configs/ # Configuration templates
├── docs/ # Documentation
├── testdata/ # Test fixtures
└── Makefile # Build automation
```
### How It Works
1. **Log Generation**:
- *Logwatch*: Root cron runs `generate-logwatch.sh` to create daily report
- *OCMS*: Single-site mode reads `OCMS_LOGS_PATH`; multisite mode derives
logs from `ocms-sites.json` and `/etc/ocms/sites.conf`
- *Drupal*: drush exports watchdog entries to JSON file
2. **Source Selection**: Application loads appropriate reader based on `LOG_SOURCE_TYPE`
3. **File Reading**: Source-specific reader validates and parses log content
4. **Preprocessing**: Large files are intelligently compressed with source-aware priority
5. **Historical Context**: Retrieves last 7 days of analysis from database
6. **AI Analysis**: Claude (Haiku 4.5 by default) analyzes with source-specific prompts
7. **Storage**: Results saved to SQLite database
8. **Notifications**: Sent to Telegram (archive channel always, alerts channel conditionally)
9. **Cleanup**: Old database entries (>90 days) are removed
## Cost Estimation
### Anthropic Claude (Cloud)
**Pricing (per 1M tokens):**
| Model | Input | Output | Cache write | Cache read |
|-------------------------------|------:|-------:|------------:|-----------:|
| claude-haiku-4-5-20251001 (default) | $1 | $5 | $1.25 | $0.10 |
| claude-sonnet-4-6 | $3 | $15 | $3.75 | $0.30 |
| claude-opus-4-7 | $5 | $25 | $6.25 | $0.50 |
Canonical pricing table lives in `internal/ai/pricing.go`.
**Typical Costs (Haiku 4.5 default):**
- **First run**: ~$0.005 (cache creation)
- **Cached run**: ~$0.003-$0.005 (cache hits)
- **Monthly (daily)**: ~$0.15/month
- **Yearly**: ~$1.80/year
Sonnet 4.6 multiplies these by ~3; Opus 4.7 by ~5.
### Ollama / LM Studio (Local)
**Cost: $0.00** - Local inference has no monetary cost.
Trade-off: Requires capable hardware (see [Ollama Setup](#ollama-setup-optional) or [LM Studio Setup](#lm-studio-setup-optional) for requirements).
## Telegram Notification Format
```
🔍 Logwatch Report
🖥 Host: server01
📅 Date: 2025-11-12 02:15:00
🌍 Timezone: Europe/London
🟢 Status: Good
📋 Execution Stats
• LLM: claude-haiku-4-5-20251001 (Anthropic)
• Critical Issues: 0
• Warnings: 2
• Recommendations: 3
• Cost: $0.0154
• Duration: 12.62s
• Cache Read: 1234 tokens
📊 Summary
System is operating normally with minor warnings...
⚡ Warnings (2)
1. Disk usage at 85% on /var partition
2. 5 failed SSH attempts from 192.168.1.50
💡 Recommendations
1. Clean up old log files in /var/log
2. Monitor IP 192.168.1.50 for activity
📈 Key Metrics
• Failed Logins: 5
• Disk Usage: 85% on /var
• Error Count: 0
```
For Drupal Watchdog with multi-site, the header shows site name:
```
🔍 Drupal Watchdog Report - Production Site
```
## Differences from Node.js Version
This Go implementation provides feature parity with the original Node.js version while offering:
### Advantages
- **Pure Go**: No CGO dependencies (using modernc.org/sqlite)
- **Simpler Deployment**: Single binary, no runtime dependencies
- **Better Performance**: Faster startup and lower memory usage
- **Type Safety**: Compile-time type checking
- **Smaller Binary**: ~10-15MB (vs ~120MB Node.js SEA)
- **Easier Cross-Compilation**: Build for any platform
### Maintained Features
- ✅ Identical AI prompts and analysis logic
- ✅ Same database schema (compatible with Node.js version)
- ✅ Same preprocessing algorithm
- ✅ Same notification format and dual-channel logic
- ✅ Same cost tracking and token estimation
- ✅ Prompt caching support
- ✅ Proxy configuration
## Development
### Running Tests
```bash
# Run all tests
make test
# Run with coverage
make coverage
make coverage-html
# Run specific package tests
go test -v ./internal/ai
go test -v ./internal/logwatch
```
### Project Dependencies
- **github.com/liushuangls/go-anthropic/v2** - Anthropic Claude SDK
- **github.com/go-telegram-bot-api/telegram-bot-api/v5** - Telegram Bot API
- **modernc.org/sqlite** - Pure Go SQLite implementation
- **github.com/spf13/viper** - Configuration management
- **github.com/rs/zerolog** - Structured logging
- **gopkg.in/natefinch/lumberjack.v2** - Log rotation
## Troubleshooting
### Common Issues
**"Configuration validation failed: ANTHROPIC_API_KEY is required"**
- Ensure `.env` file exists and contains valid API key
**"Logwatch file is too old"**
- Check if logwatch cron is running: `sudo crontab -l`
- Verify logwatch output exists: `ls -lh /tmp/logwatch-output.txt`
**"Failed to send to archive channel"**
- Verify bot is added as admin to the channel
- Check channel ID starts with `-100`
- Test bot token: `curl https://api.telegram.org/bot/getMe`
**Database locked errors**
- Ensure only one instance is running
- Check file permissions on `data/` directory
- Built-in 5-second busy timeout handles temporary lock contention
**Drupal Watchdog: "Invalid JSON format"**
- Ensure watchdog export is valid JSON array format
- Check for UTF-8 encoding issues in log messages
- Validate with: `jq . /path/to/watchdog.json`
**Drupal Watchdog: "Missing entries"**
- Check `watchdog_format` in drupal-sites.json matches your file format
- Verify file permissions and watchdog_path
- Ensure drush export includes `--count` parameter
**Ollama: "connection refused" or "ollama is not running"**
- Ensure Ollama server is running: `ollama serve`
- Check the base URL in `.env`: `OLLAMA_BASE_URL=http://localhost:11434`
- Test connection: `curl http://localhost:11434/api/tags`
**Ollama: "model not found"**
- Pull the model first: `ollama pull `
- List available models: `ollama list`
- Verify model name matches `.env`: `OLLAMA_MODEL=llama3.3:latest`
**Ollama: Slow response or timeout**
- Large models (70B+) require significant RAM and may be slow
- Consider a smaller model for faster inference
- Increase timeout: `AI_TIMEOUT_SECONDS=300`
- Check system resources: `htop` or Activity Monitor
**LM Studio: "connection refused" or "LM Studio is not running"**
- Ensure LM Studio is open and the Local Server is started
- Check the server is running on the correct port (default: 1234)
- Verify the base URL in `.env`: `LMSTUDIO_BASE_URL=http://localhost:1234`
- Test connection: `curl http://localhost:1234/v1/models`
**LM Studio: "no models loaded"**
- Load a model in LM Studio before starting the analyzer
- Click on a model in the Models tab and click "Load"
- Verify model is loaded (shows in the top bar)
**LM Studio: Slow response or timeout**
- Large models require significant RAM and may be slow
- Consider loading a smaller/quantized model
- Increase timeout: `AI_TIMEOUT_SECONDS=300`
- Check GPU acceleration is enabled in LM Studio settings
See [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) for more solutions.
## Contributing
Contributions are welcome! Please:
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests if applicable
5. Submit a pull request
## Acknowledgments
- Original [logwatch-ai](https://github.com/olegiv/logwatch-ai) Node.js implementation
- [Anthropic](https://www.anthropic.com/) for Claude AI
- The Go community for excellent libraries
## Support
- **Issues**: [GitHub Issues](https://github.com/olegiv/logwatch-ai-go/issues)
- **Discussions**: [GitHub Discussions](https://github.com/olegiv/logwatch-ai-go/discussions)
- **Original Project**: [logwatch-ai](https://github.com/olegiv/logwatch-ai)
## License
Copyright (C) 2025-2026 Oleg Ivanchenko
GNU General Public License v3.0 - see [LICENSE](LICENSE) file for details.