조직 감사 로그(Organization Audit Logs)

조직 감사 로그(Organization Audit Logs)

조직 전반에서 수행된 모든 작업의 로그를 확인할 수 있는 페이지예요. 조직 감사 로그는 조직 내 모든 프로젝트에서 수행된 모든 작업에 대한 중앙 집중식 보기를 제공해요. 보안 검토, 컴플라이언스, 그리고 팀 간 활동 파악에 유용하죠.

출처: 문서

본문

조직 감사 로그

개요

조직 감사 로그 페이지는 모든 프로젝트의 모든 API·사용자 작업을 보여줘요. 각 로그 항목은 다음을 포함해요:

열(Column) 설명
Date 작업의 타임스탬프 (UTC).
Status 작업이 반환한 HTTP 상태 코드 (성공은 200 등).
Logs 수행된 작업. 메서드와 리소스 경로로 표시됨 (예: PUT org.users.role.update).
Project 작업이 수행된 프로젝트 (조직 수준 작업에서는 표시되지 않음).
User 작업을 트리거한 사용자 또는 API 키의 이메일.

프로젝트 수준 감사 로그와 비교해, 조직 보기는 Project 열을 추가해서 각 작업이 어느 프로젝트에 속하는지 보여줘요. 조직 수준 작업(사용자 역할 변경 등)도 여기에 포함돼요.

상단의 타임라인 차트가 모든 프로젝트에 걸친 시간 흐름별 작업량을 시각화해요.

로그 검색

검색 바를 사용해 작업 이름, 사용자 이메일, 프로젝트, 상태 코드, 리소스 경로 등 어떤 필드로든 로그를 필터링할 수 있어요. 여러 프로젝트에 걸친 특정 사용자의 활동을 감사하거나 조직 전반의 구성 변경을 추적하는 데 유용해요.

로그 내보내기

Save as CSV를 클릭해 감사 로그를 내보내요. Current view를 선택하면 뷰어가 보여주는 것을, All time을 선택하면 조직에 기록된 모든 감사 로그를 내보내요. 대화상자에서 커밋 전에 정확한 행 수와 날짜 범위를 보여줘요.

작은 내보내기는 즉시 다운로드돼요. 큰 것은 백그라운드에서 준비돼요: 이 페이지에 진행 상황을 보여주는 카드가 나타나고, 파일이 준비되면 이메일을 받으며, Download CSV 버튼이 완성된 파일(gzipped CSV)을 줘요. 다운로드 링크는 클릭할 때마다 새로 생성되고 15분 후 만료돼요.

조직 Owner와 Admin만 감사 로그를 내보낼 수 있어요. 한 번에 하나의 내보내기가 실행돼요.

프로그래매틱하게 내보내기를 시작할 수도 있어요:

요청 (POST /v1/organization/audit-logs/exports) — API 참조

curl -X POST "https://api.confident-ai.com/v1/organization/audit-logs/exports" \
  -H "CONFIDENT_API_KEY: <ORGANIZATION-API-KEY>" \
  -H "Content-Type: application/json" \
  -d '{}'
import requests

response = requests.post(
    "https://api.confident-ai.com/v1/organization/audit-logs/exports",
    headers={
        "CONFIDENT_API_KEY": "<ORGANIZATION-API-KEY>",
    },
    json={},
)

print(response.json())
const response = await fetch("https://api.confident-ai.com/v1/organization/audit-logs/exports", {
  method: "POST",
  headers: {
    "CONFIDENT_API_KEY": "<ORGANIZATION-API-KEY>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({}),
});

const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
)

func main() {
	body := `{}`

	req, err := http.NewRequest("POST", "https://api.confident-ai.com/v1/organization/audit-logs/exports", strings.NewReader(body))
	if err != nil {
		panic(err)
	}
	req.Header.Set("CONFIDENT_API_KEY", "<ORGANIZATION-API-KEY>")
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	out, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(out))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
    public static void main(String[] args) throws Exception {
        String body = """
            {}""";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.confident-ai.com/v1/organization/audit-logs/exports"))
            .header("CONFIDENT_API_KEY", "<ORGANIZATION-API-KEY>")
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let response = reqwest::Client::new()
        .post("https://api.confident-ai.com/v1/organization/audit-logs/exports")
        .header("CONFIDENT_API_KEY", "<ORGANIZATION-API-KEY>")
        .json(&json!({}))
        .send()
        .await?;

    println!("{}", response.text().await?);

    Ok(())
}

일반적인 작업(Common Actions)

작업은 resource.action 네이밍 패턴을 따라요. 몇 가지 예:

  • org.users.role.update — 사용자의 조직 역할 업데이트
  • org.retention-configs.retention-policies.create — 조직 수준 보존 정책 생성
  • client.prompts.branches.update / delete — 프로젝트의 프롬프트 브랜치 업데이트 또는 삭제
  • client.rt-frameworks.schedule.create / delete — 실시간 프레임워크 일정 생성 또는 삭제

더 알아보기