Hot to use typelist of Loki??

本文介绍了一个使用C++模板元编程实现的示例程序,通过定义泛型类型列表、获取类型列表长度、根据索引获取类型等功能,实现了字体表中不同表格的读取操作及按名称创建对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近调试的一段代码,请一起look look!
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
namespace MCD
{
    template<class T,class U>
	struct Typelist{
	    typedef T Head;
		typedef U Tail;
	};

    class NullType;
#define TYPELIST_1(T1) Typelist<T1,NullType>
#define TYPELIST_2(T1,T2) Typelist<T1,TYPELIST_1(T2)>
#define TYPELIST_3(T1,T2,T3) Typelist<T1,TYPELIST_2(T2,T3)>
#define TYPELIST_4(T1,T2,T3,T4) Typelist<T1,TYPELIST_3(T2,T3,T4)>
	
	template<class Tlist> struct Length;
	template<> struct Length<NullType>
	{
	    enum{value = 0};
	};

	template<class T,class U>
	struct Length<Typelist<T,U> >
	{
		enum{value = 1 + Length<U>::value};
	};

	template<class Tlist,unsigned int index> struct TypeAt;
	template<class Head,class Tail>
	struct TypeAt<Typelist<Head,Tail>,0>
	{
	    typedef Head Result;	
	};

	template<class Head,class Tail,unsigned int i>
	struct TypeAt<Typelist<Head,Tail>,i>
	{
	    typedef typename TypeAt<Tail,i-1>::Result Result;
	};
} // End of MCD

namespace SolidMCP
{
	class FontTable
	{
	public:
		virtual void Read(){
			std::cout << "Reading Font Table" << std::endl;
		}
	};

	class CMAP_Table:public FontTable
	{
	public:
		CMAP_Table() {
			std::cout << "Initializing CMAP Table" << std::endl;
		}

		void Read() {
			std::cout << "Read CMAP Table" << std::endl;
		}

		static char* GetName() {
		    return "CMAP_Table";
		}
	};

	class OS2_Table:public FontTable
	{
	public:
		OS2_Table()
		{
			std::cout << "Initializing OS2 Table" << std::endl;
		}

		void Read()
		{
			std::cout << "Read OS2 Table" << std::endl;
		}

		static char* GetName()
		{
			return "OS2_Table";
		}
	};

    class HEAD_Table:public FontTable
	{
	public:
		HEAD_Table(){
			std::cout<< "Initializing HEAD Table" << std::endl;
		}

		void Read(){
			std::cout << "Read HEAD Table" << std::endl;
		}

		static char* GetName(){
			return "HEAD_Table";
		}
	};
	
	class HHEA_Table:public FontTable
	{
	public:
		HHEA_Table(){
			std::cout << "Initializing HHEA Table" << std::endl;
		}

		void Read() {
			std::cout << "Read HHEA Table" << std::endl;
		}

		static char* GetName()
		{
			return "HHEA_Table";
		}
	};
	
	class Unknown_Table:public FontTable
	{
	public:
	    Unknown_Table(){
			std::cout << "Initializing Unknown Table" << std::endl;
		}

		void Read() {
			std::cout << "Read Unknown Table" << std::endl;
		}

		static char* GetName()
		{
			return "Unknown_Table";
		}
	};	

	template<class Tlist> struct ReadTable;
	template<class T>
	struct ReadTable<MCD::Typelist<T,MCD::NullType> >
	{
		static bool Execute()
		{
			T table;
			table.Read();
			return true;
		}
	};

	template<class T,class U>
	struct ReadTable<MCD::Typelist<T,U> >
	{
		static bool Execute()
		{
			if(ReadTable<MCD::Typelist<typename U::Head,typename U::Tail> >::Execute())
			{
			    T table;
				table.Read();
			}
			return true;
		}
	};

	// ReadTaleLoop
	template<class T,int i> struct ReadTableLoop
	{
	    static void Execute()
		{
			// g递归ui用的很好 
			ReadTableLoop<T,i-1>::Execute();
			typename MCD::TypeAt<T,i-1>::Result table;
			table.Read();
		}
	};

	template<class T> struct ReadTableLoop<T,0>
	{
	    static void Execute(){}
	};

	// create table class Name
	template<class Tlist> struct CreateObject;

	template<class T,class U>
	struct CreateObject<MCD::Typelist<T,U> >
	{
	    static void* Execute(char* pName)
		{
			if(strcmp(T::GetName(),pName) == 0)
		    {
				return new T; 
			}else{
				return CreateObject<U>::Execute(pName);
			}
		}
	};

	template<>
	struct CreateObject<MCD::NullType>
	{
		static void* Execute(char* pName)
		{
			return NULL;
		}
	};	
}// END OF SoildMCP

// How to use
using namespace SolidMCP;
using namespace MCD;

int main()
{
	typedef TYPELIST_4(CMAP_Table,OS2_Table,HEAD_Table,HHEA_Table) FontTableList;
	std::cout << "--Length is " << Length<FontTableList>::value << std::endl;
	std::cout << "Read the 2nd Table" << std::endl;
	TypeAt<FontTableList,2>::Result table;
	table.Read();

	std::cout<<"Begin ReadTable" << std::endl;
	ReadTable<FontTableList>::Execute();


	std::cout << "Begin ReadTableLoop" << std::endl;
	ReadTableLoop<FontTableList,Length<FontTableList>::value>::Execute();

	std::cout << "Begin Create Object By Name" << std::endl;
	FontTable* pTable = (FontTable *)CreateObject<FontTableList>::Execute("HEAD_Table");
	pTable->Read();

	return 0;
}
<think>好的,用户之前已经询问过Loki和Promtail的基本配置,现在他们想知道Loki是否有自己的Web控制台页面。我需要先回忆一下Loki的相关知识。 Loki主要是日志聚合系统,通常和Grafana配合使用,因为Grafana是可视化的工具。可能用户在使用Loki的时候,发现没有内置的界面,所以产生了疑问。需要确认Loki本身是否提供Web界面,或者是否需要依赖其他工具。 根据我掌握的信息,Loki本身并没有内置的Web控制台,它的主要功能是存储和查询日志,而可视化通常由Grafana处理。不过,用户可能听说Loki有简单的管理接口,比如通过HTTP API访问的/metrics或者/config等端点,但这些并不是图形界面。 可能需要提到Loki 2.0之后引入的Loki Canary,这是用来监控Loki本身运行状况的工具,但它也不是用户界面。另外,Loki的日志查询需要通过LogQL,而执行查询通常是在Grafana中完成。 用户可能真正需要的是如何查看和管理Loki的日志数据,所以需要解释清楚Loki和Grafana的关系,以及如何通过Grafana来构建控制面板。同时,可能需要提到一些替代方案,比如使用命令行工具如LogCLI,或者第三方工具如Plausible labs的界面。 还要注意用户可能的误区,以为Loki像Prometheus一样有自带的Web UI,但实际上两者设计不同,Loki专注于后端存储和查询,前端交给其他工具处理。 最后,应该总结Loki没有自己的Web控制台,但可以通过Grafana等工具实现可视化,并给出具体的配置步骤或示例,帮助用户搭建完整的监控系统。</think>以下是关于 **Loki 是否拥有自己的 Web 控制台页面**的详细说明: --- ### 一、核心结论 **Loki 本身没有原生的图形化 Web 控制台页面**。它专注于轻量级日志聚合和存储,**核心功能通过 API 提供**(如日志写入、查询等)。但可通过以下方式实现可视化操作: --- ### 二、替代方案与工具 #### 1. **Grafana(官方推荐)** - **功能**:通过 Loki 数据源插件直接查询日志(支持 LogQL),是 Loki 的“官方控制台”。 - **配置步骤**: 1. 安装 Grafana 并添加 Loki 数据源: ```yaml # Grafana 数据源配置示例(HTTP URL 指向 Loki 服务) apiVersion: 1 datasources: - name: Loki type: loki access: proxy url: http://loki:3100 ``` 2. 在 Grafana 中通过 **Explore** 模式或自定义仪表盘查询日志: ![Grafana Explore 界面示例](https://grafana.com/static/img/docs/explore/logs_explore.png) #### 2. **Loki 内置调试接口** - **用途**:查看运行状态和基础信息,非图形化界面。 - **访问方式**: - **配置信息**:`http://<loki-ip>:3100/config`(需启用 `-server.http.enable-admin-api` 参数) - **运行指标**:`http://<loki-ip>:3100/metrics` - **就绪检查**:`http://<loki-ip>:3100/ready` #### 3. **第三方工具** - **LogCLI**:Loki 官方命令行工具,支持终端查询: ```bash logcli query '{job="nginx"}' --addr=http://loki:3100 --limit=100 ``` - **Ploutos**:社区开发的开源 Web 界面(非官方),支持简单查询: ```bash docker run -p 8080:8080 plutoops/ploutos -loki http://loki:3100 ``` --- ### 三、Loki 2.4+ 的新特性 从 Loki 2.4 版本开始,**实验性支持 Web 预览功能**: 1. **启用方式**:启动 Loki 时添加 `-frontend.enable-experimental-web` 参数。 2. **访问地址**:`http://<loki-ip>:3100/web`(仅支持基础查询,功能有限)。 --- ### 四、对比 Prometheus 与 Prometheus(自带 Web UI)不同,Loki 的设计理念是**专注存储/查询,解耦可视化**,因此依赖 Grafana 等工具实现完整控制台功能。 --- ### 五、推荐实践 1. **生产环境**:通过 **Grafana + AlertManager** 构建完整的日志监控体系。 2. **快速调试**:使用 `LogCLI` 或直接调用 Loki 的 API: ```bash curl -G http://loki:3100/loki/api/v1/query_range \ --data-urlencode 'query={job="syslog"}' \ --data-urlencode 'limit=50' ``` --- 通过以上工具组合,可弥补 Loki 原生 Web 控制台的缺失,实现灵活高效的日志管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值